From 3a5bc4413a90c33facbd8858432c42234cef78ba Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Fri, 24 Sep 2021 11:03:50 -0500 Subject: [PATCH 01/15] SSL Configuration updates (#1400) Funnel all :httpc usage through one function to ensure SSL verification. Use Hackney Adapter for Tesla. --- .tool-versions | 2 +- CHANGELOG.md | 9 +++++++ VERSION | 2 +- .../farmware_installation_worker.ex | 2 +- .../farmbot_celery_script/scheduler_test.exs | 3 +-- farmbot_ext/config/config.exs | 1 + farmbot_ext/lib/farmbot_ext/api_fetcher.ex | 9 +++++-- .../farmbot_ext/bootstrap/authorization.ex | 2 +- farmbot_ext/lib/farmbot_ext/http.ex | 11 --------- .../bootstrap/authorization_test.exs | 2 +- farmbot_ext/test/farmbot_ext/http_test.exs | 9 +++---- farmbot_ext/test/test_helper.exs | 2 +- .../farmbot_os/lua/ext/data_manipulation.ex | 2 +- farmbot_os/lib/farmbot_os/update_support.ex | 7 +++--- farmbot_os/rootfs_overlay/farmware/test.txt | 1 + .../lua/ext/data_manipulation_test.exs | 2 +- farmbot_os/test/test_helper.exs | 2 +- .../lib/farmbot_telemetry/http.ex | 24 +++++++++++++++++++ farmbot_telemetry/mix.exs | 2 +- 19 files changed, 60 insertions(+), 34 deletions(-) delete mode 100644 farmbot_ext/lib/farmbot_ext/http.ex create mode 100644 farmbot_os/rootfs_overlay/farmware/test.txt create mode 100644 farmbot_telemetry/lib/farmbot_telemetry/http.ex diff --git a/.tool-versions b/.tool-versions index ffffd9b34..51b03063a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -erlang 24.0.4 +erlang 24.0.5 elixir 1.12.2-otp-24 diff --git a/CHANGELOG.md b/CHANGELOG.md index 467b5e3e5..0763cf59a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +# 14.4.2 + + * SSL/HTTPS configuration updates. + +# 14.4.1 + + * Update Erlang version + * Update error reporting info + # 14.4.0 * Upgrade Nerves system, Erlang, Elixir, OTP. diff --git a/VERSION b/VERSION index e4c90c9f5..184baa493 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.4.0-rc1 +14.4.2-rc0 diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex index 8aaa617d5..3afb4d6df 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex @@ -231,7 +231,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do end defp get(url) do - :httpc.request(:get, {to_charlist(url), httpc_headers()}, [], httpc_options()) + FarmbotTelemetry.HTTP.request(:get, {to_charlist(url), httpc_headers()}, [], httpc_options()) end defp httpc_options, do: [body_format: :binary] diff --git a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs b/farmbot_core/test/farmbot_celery_script/scheduler_test.exs index 3d5ce6ab9..48765674c 100644 --- a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/scheduler_test.exs @@ -13,8 +13,7 @@ defmodule FarmbotCeleryScript.SchedulerTest do 23 end) - {:ok, sch} = - Scheduler.start_link([registry_name: :"#{:random.uniform()}"], []) + {:ok, sch} = Scheduler.start_link([registry_name: :"#{UUID.uuid1()}"], []) ast = AST.Factory.new() diff --git a/farmbot_ext/config/config.exs b/farmbot_ext/config/config.exs index c7d0feb4e..4501b7d51 100644 --- a/farmbot_ext/config/config.exs +++ b/farmbot_ext/config/config.exs @@ -1,4 +1,5 @@ use Mix.Config +config :tesla, adapter: Tesla.Adapter.Hackney config :logger, handle_otp_reports: true, handle_sasl_reports: true diff --git a/farmbot_ext/lib/farmbot_ext/api_fetcher.ex b/farmbot_ext/lib/farmbot_ext/api_fetcher.ex index c53ea47a7..33a00215f 100644 --- a/farmbot_ext/lib/farmbot_ext/api_fetcher.ex +++ b/farmbot_ext/lib/farmbot_ext/api_fetcher.ex @@ -71,14 +71,19 @@ defmodule FarmbotExt.APIFetcher do uri = URI.parse(server) user_agent = "FarmbotOS/#{@version} (#{@target}) #{@target} ()" - Tesla.client([ + middleware = [ {Tesla.Middleware.BaseUrl, "#{uri.scheme}:#{url}"}, {Tesla.Middleware.Headers, [ {"user-agent", user_agent} ]}, {Tesla.Middleware.FormUrlencoded, []} - ]) + ] + + adapter = + {Tesla.Adapter.Hackney, ssl: [verify: :verify_peer, cacertfile: :certifi.cacertfile()]} + + Tesla.client(middleware, adapter) end def upload_image(image_filename, meta \\ %{}) do diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex b/farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex index bc98e4538..90afb993d 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex +++ b/farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex @@ -125,7 +125,7 @@ defmodule FarmbotExt.Bootstrap.Authorization do do: {to_charlist(url), headers}, else: {to_charlist(url), headers, 'Application/JSON', payload} - resp = FarmbotExt.HTTP.request(method, request, [], opts) + resp = FarmbotTelemetry.HTTP.request(method, request, [], opts) case resp do {:ok, {{_, c, _}, _headers, body}} when c >= 200 and c <= 299 -> diff --git a/farmbot_ext/lib/farmbot_ext/http.ex b/farmbot_ext/lib/farmbot_ext/http.ex deleted file mode 100644 index 5120c2ed2..000000000 --- a/farmbot_ext/lib/farmbot_ext/http.ex +++ /dev/null @@ -1,11 +0,0 @@ -defmodule FarmbotExt.HTTP do - @moduledoc """ - A very thin wrapper around :httpc and :hackney to facilitate - mocking. Do not add functionality to the module. - """ - def request(method, params, opts1, opts2) do - :httpc.request(method, params, opts1, opts2) - end - - def hackney(), do: :hackney -end diff --git a/farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs b/farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs index 52b67b146..cefcca0ae 100644 --- a/farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs +++ b/farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs @@ -43,7 +43,7 @@ defmodule FarmbotExt.Bootstrap.AuthorizationTest do request = {:get, url, "", headers} state = %{backoff: 5000, log_dispatch_flag: false} - expect(FarmbotExt.HTTP, :request, 1, fn method, req, opt1, opt2 -> + expect(FarmbotTelemetry.HTTP, :request, 1, fn method, req, opt1, opt2 -> assert method == :get assert req == {url, [{'Content-Type', 'application/json'}]} assert opt1 == [] diff --git a/farmbot_ext/test/farmbot_ext/http_test.exs b/farmbot_ext/test/farmbot_ext/http_test.exs index 18f4da833..c76d53f99 100644 --- a/farmbot_ext/test/farmbot_ext/http_test.exs +++ b/farmbot_ext/test/farmbot_ext/http_test.exs @@ -1,12 +1,9 @@ -defmodule FarmbotExt.HTTPTest do - # def request(method, params, opts1, opts2) do - # :httpc.request(method, params, opts1, opts2) - # end +defmodule FarmbotTelemetry.HTTPTest do use ExUnit.Case - alias FarmbotExt.HTTP + alias FarmbotTelemetry.HTTP test "request/4" do params = {'http://typo.farm.bot', []} - assert {:error, error} = HTTP.request(:head, params, [], []) + assert {:error, _error} = HTTP.request(:head, params, [], []) end end diff --git a/farmbot_ext/test/test_helper.exs b/farmbot_ext/test/test_helper.exs index 9c0e483e2..7e0b6d1a7 100644 --- a/farmbot_ext/test/test_helper.exs +++ b/farmbot_ext/test/test_helper.exs @@ -24,7 +24,7 @@ Application.ensure_all_started(:mimic) FarmbotExt.APIFetcher, FarmbotExt.Bootstrap.Authorization, FarmbotExt.Bootstrap.DropPasswordSupport, - FarmbotExt.HTTP, + FarmbotTelemetry.HTTP, FarmbotExt.MQTT, FarmbotExt.MQTT.LogHandlerSupport, FarmbotExt.MQTT.Support, diff --git a/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex b/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex index 90cdaf117..a64f78203 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex +++ b/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex @@ -7,7 +7,7 @@ defmodule FarmbotOS.Lua.Ext.DataManipulation do alias FarmbotCore.Asset.{Device, FbosConfig, FirmwareConfig} alias FarmbotOS.Lua.Util alias FarmbotOS.SysCalls.ResourceUpdate - alias FarmbotExt.HTTP + alias FarmbotTelemetry.HTTP alias FarmbotCeleryScript.SpecialValue @methods %{ diff --git a/farmbot_os/lib/farmbot_os/update_support.ex b/farmbot_os/lib/farmbot_os/update_support.ex index 17f3861a8..7d70ee777 100644 --- a/farmbot_os/lib/farmbot_os/update_support.ex +++ b/farmbot_os/lib/farmbot_os/update_support.ex @@ -37,7 +37,8 @@ defmodule FarmbotOS.UpdateSupport do def download_update_image(url) do params = {to_charlist(url), []} - {:ok, :saved_to_file} = :httpc.request(:get, params, [], stream: @dl_path) + {:ok, :saved_to_file} = + FarmbotTelemetry.HTTP.request(:get, params, [], stream: @dl_path) end # Crash the current process if there is already an OTA in @@ -70,7 +71,7 @@ defmodule FarmbotOS.UpdateSupport do end end - # :httpc callback when a JSON download succeeds (/api/releases?platform=foo) + # FarmbotTelemetry.HTTP callback when a JSON download succeeds (/api/releases?platform=foo) def handle_http_response({:ok, {{_, 200, _}, _response_headers, body}}) do {:ok, map} = JSON.decode(body) map @@ -97,7 +98,7 @@ defmodule FarmbotOS.UpdateSupport do url = calculate_url(target) t = FarmbotCore.Config.get_config_value(:string, "authorization", "token") params = {to_charlist(url), [{'Authorization', to_charlist(t)}]} - http_resp = :httpc.request(:get, params, [], []) + http_resp = FarmbotTelemetry.HTTP.request(:get, params, [], []) handle_http_response(http_resp) end diff --git a/farmbot_os/rootfs_overlay/farmware/test.txt b/farmbot_os/rootfs_overlay/farmware/test.txt new file mode 100644 index 000000000..8f214dd3d --- /dev/null +++ b/farmbot_os/rootfs_overlay/farmware/test.txt @@ -0,0 +1 @@ +Test123 diff --git a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs b/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs index bb060ca39..9a491659e 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs +++ b/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs @@ -307,7 +307,7 @@ defmodule FarmbotOS.Lua.Ext.DataManipulationTest do end test "http" do - expect(FarmbotExt.HTTP, :hackney, 1, fn -> FakeHackney end) + expect(FarmbotTelemetry.HTTP, :hackney, 1, fn -> FakeHackney end) params = FarmbotOS.Lua.Util.map_to_table(%{ diff --git a/farmbot_os/test/test_helper.exs b/farmbot_os/test/test_helper.exs index 70e00da26..a961e698f 100644 --- a/farmbot_os/test/test_helper.exs +++ b/farmbot_os/test/test_helper.exs @@ -17,7 +17,7 @@ Application.ensure_all_started(:mimic) FarmbotExt.API, FarmbotExt.API.Reconciler, FarmbotExt.Bootstrap.Authorization, - FarmbotExt.HTTP, + FarmbotTelemetry.HTTP, FarmbotOS.Configurator.ConfigDataLayer, FarmbotOS.Configurator.DetsTelemetryLayer, FarmbotOS.Configurator.FakeNetworkLayer, diff --git a/farmbot_telemetry/lib/farmbot_telemetry/http.ex b/farmbot_telemetry/lib/farmbot_telemetry/http.ex new file mode 100644 index 000000000..e87a7237b --- /dev/null +++ b/farmbot_telemetry/lib/farmbot_telemetry/http.ex @@ -0,0 +1,24 @@ +defmodule FarmbotTelemetry.HTTP do + @moduledoc """ + A very thin wrapper around :httpc and :hackney to facilitate + mocking and set system-wide default configuration. + """ + def request(method, params, opts1, opts2) do + opts_with_default = Keyword.merge(ssl_opts(), opts1) + :httpc.request(method, params, opts_with_default, opts2) + end + + def hackney(), do: :hackney + + def ssl_opts, + do: [ + ssl: [ + verify: :verify_peer, + cacertfile: :certifi.cacertfile(), + depth: 10, + customize_hostname_check: [ + match_fun: :public_key.pkix_verify_hostname_match_fun(:https) + ] + ] + ] +end diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs index 319ef7674..860dbf02f 100644 --- a/farmbot_telemetry/mix.exs +++ b/farmbot_telemetry/mix.exs @@ -39,7 +39,7 @@ defmodule FarmbotTelemetry.MixProject do # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger, :crypto], + extra_applications: [:logger, :crypto, :inets, :certifi], mod: {FarmbotTelemetry.Application, []} ] end From 1ad55123fbff9cacf4bc9a64e9c53c7ee20c7fbb Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Sat, 25 Sep 2021 07:52:22 -0500 Subject: [PATCH 02/15] Routine Test Suite Updates (#1401) Routine test suite updates --- COVERAGE.md | 7 ++++ farmbot_core/coveralls.json | 2 +- .../farm_event_worker/sequence_event_test.exs | 11 ++++++ .../test/config_storage/string_value_test.exs | 10 +++++ farmbot_ext/coveralls.json | 2 +- .../farmbot_ext/api/eager_loader_test.exs | 6 +++ farmbot_os/coveralls.json | 2 +- farmbot_telemetry/mix.exs | 8 +++- .../test/farmbot_telemetry_test.exs | 37 ++++++++++--------- farmbot_telemetry/test/http_test.exs | 21 +++++++++++ 10 files changed, 84 insertions(+), 22 deletions(-) create mode 100644 farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs create mode 100644 farmbot_core/test/config_storage/string_value_test.exs create mode 100644 farmbot_telemetry/test/http_test.exs diff --git a/COVERAGE.md b/COVERAGE.md index 088321c46..4ef6c19fa 100644 --- a/COVERAGE.md +++ b/COVERAGE.md @@ -15,3 +15,10 @@ | farmbot_ext |58.0% |58.9% | | farmbot_os |59.3% |60.8% | | farmbot_telemetry |41.4% |41.4% | + +| Project |9/23/21|9/24/21| +|-----------------------|-------|-------| +| farmbot_core |59.4% |59.6% | +| farmbot_ext |61.0% |61.1% | +| farmbot_os |62.4% |62.4% | +| farmbot_telemetry |41.4% |58.3% | diff --git a/farmbot_core/coveralls.json b/farmbot_core/coveralls.json index 8ffdcb7b3..0f7ba4c24 100644 --- a/farmbot_core/coveralls.json +++ b/farmbot_core/coveralls.json @@ -1,7 +1,7 @@ { "coverage_options": { "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 0.42 + "minimum_coverage": 58.0 }, "skip_files": [ "test/support/test_support.ex" diff --git a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs b/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs new file mode 100644 index 000000000..4a3776bc8 --- /dev/null +++ b/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs @@ -0,0 +1,11 @@ +defmodule FarmbotCore.FarmEventWorker.SequenceTest do + use ExUnit.Case + + alias FarmbotCore.FarmEventWorker.SequenceEvent + + test "init/1" do + arry = [:farm_event, :args] + {:ok, %{farm_event: :farm_event, args: :args}} = SequenceEvent.init(arry) + assert_receive :schedule, 1000 + end +end diff --git a/farmbot_core/test/config_storage/string_value_test.exs b/farmbot_core/test/config_storage/string_value_test.exs new file mode 100644 index 000000000..ac78e736e --- /dev/null +++ b/farmbot_core/test/config_storage/string_value_test.exs @@ -0,0 +1,10 @@ +defmodule FarmbotCore.Config.StringValueTest do + use ExUnit.Case + alias FarmbotCore.Config.StringValue + + test "changeset" do + sv = %StringValue{value: "Foo"} + cs = StringValue.changeset(sv) + assert cs.data == sv + end +end diff --git a/farmbot_ext/coveralls.json b/farmbot_ext/coveralls.json index 9072ea43d..c4461cedc 100644 --- a/farmbot_ext/coveralls.json +++ b/farmbot_ext/coveralls.json @@ -1,6 +1,6 @@ { "coverage_options": { "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 48.0 + "minimum_coverage": 59.0 } } diff --git a/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs b/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs index 1ee9219d2..109341820 100644 --- a/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs +++ b/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs @@ -35,4 +35,10 @@ defmodule FarmbotExt.API.EagerLoaderTest do assert [] = EagerLoader.preload(%Sync{tools: []}) end + + test "finish_loading/1" do + fake_errors = [1, 2, 3] + assert [] == EagerLoader.finish_loading([]) + assert {:error, fake_errors} == EagerLoader.finish_loading(fake_errors) + end end diff --git a/farmbot_os/coveralls.json b/farmbot_os/coveralls.json index eb2c5891e..021731ea4 100644 --- a/farmbot_os/coveralls.json +++ b/farmbot_os/coveralls.json @@ -1,6 +1,6 @@ { "coverage_options": { "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 55 + "minimum_coverage": 60 } } diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs index 860dbf02f..b6baba32b 100644 --- a/farmbot_telemetry/mix.exs +++ b/farmbot_telemetry/mix.exs @@ -39,7 +39,13 @@ defmodule FarmbotTelemetry.MixProject do # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger, :crypto, :inets, :certifi], + extra_applications: [ + :certifi, + :crypto, + :inets, + :logger, + :public_key + ], mod: {FarmbotTelemetry.Application, []} ] end diff --git a/farmbot_telemetry/test/farmbot_telemetry_test.exs b/farmbot_telemetry/test/farmbot_telemetry_test.exs index 7e4707ae4..d6485df9e 100644 --- a/farmbot_telemetry/test/farmbot_telemetry_test.exs +++ b/farmbot_telemetry/test/farmbot_telemetry_test.exs @@ -24,23 +24,24 @@ defmodule FarmbotTelemetryTest do assert meta[:hello] == "world" end - test "consumes telemetry" do - me = self() - - FarmbotTelemetry.consume_telemetry(fn - {uuid, date, event, :test_subsystem, kind, value, meta} -> - assert is_binary(uuid) - assert %DateTime{} = date - assert event == :event - assert kind == :measurement - assert value == 1.0 - %{file: _, function: _, line: _, module: _} = meta - send(me, :ok) - - _ -> - :ok - end) - - assert_receive :ok, 5_000 + test "telemetry_meta" do + result = FarmbotTelemetry.telemetry_meta(__ENV__, %{}) + assert String.contains?(result.file, "farmbot_telemetry_test.exs") + assert result.function == {:"test telemetry_meta", 1} + assert is_number(result.line) + assert result.module == FarmbotTelemetryTest + end + + test "event (unknown params)" do + # This test is terrible. + # If anyone want to refactor this, have at it. RC. + boom = fn -> + Code.eval_string(""" + require FarmbotTelemetry + FarmbotTelemetry.event(\"?\", \"?\", \"?\", \"?\") + """) + end + + assert_raise Mix.Error, boom end end diff --git a/farmbot_telemetry/test/http_test.exs b/farmbot_telemetry/test/http_test.exs new file mode 100644 index 000000000..5f951149b --- /dev/null +++ b/farmbot_telemetry/test/http_test.exs @@ -0,0 +1,21 @@ +defmodule FarmbotTelemetry.HTTPTest do + use ExUnit.Case + doctest FarmbotTelemetry.HTTP + + def get(url) do + FarmbotTelemetry.HTTP.request(:get, {to_charlist(url), []}, [], []) + end + + @bad_urls [ + "https://expired.badssl.com/", + "https://wrong.host.badssl.com/", + "https://self-signed.badssl.com/" + ] + + test "request/4" do + case get("https://badssl.com") do + {:ok, _} -> Enum.map(@bad_urls, fn url -> {:error, _} = get(url) end) + _ -> IO.warn("Can't reach https://badssl.com; Not testing SSL parts.") + end + end +end From 9115c6a382a0460caa0b6ef3cd2409de6b7401e6 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Sat, 25 Sep 2021 08:13:11 -0500 Subject: [PATCH 03/15] Test Suite Updates (#1402) FIX: Add farmbot_telemetry to CI build. --- .circleci/config.yml | 40 ++++++++++++++++++++++++++++++++ farmbot_telemetry/coveralls.json | 6 +++++ 2 files changed, 46 insertions(+) create mode 100644 farmbot_telemetry/coveralls.json diff --git a/.circleci/config.yml b/.circleci/config.yml index cee446517..94a5ffa76 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -157,6 +157,40 @@ jobs: ################################################################################ # TEST # ################################################################################ + test_farmbot_telemetry: + <<: *defaults + environment: + MIX_ENV: test + MIX_TARGET: host + ELIXIR_VERSION: 1.12.2 + steps: + - checkout + - run: git submodule update --init --recursive + - restore_cache: + keys: + - v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_telemetry/mix.lock" }} + - <<: *install_elixir + - <<: *install_hex_archives + - run: + name: Test Farmbot Telemetry + working_directory: /nerves/build/farmbot_telemetry + command: | + mix deps.get + mix compile + mix format --check-formatted + mix coveralls.json + bash <(curl -s https://codecov.io/bash) + - save_cache: + key: v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_telemetry/mix.lock" }} + paths: + - farmbot_telemetry/_build/host + - farmbot_telemetry/deps/host + - save_cache: + key: v14-fbos-coverage-cache-{{ .Branch }}-{{ .Revision }} + paths: + - farmbot_telemetry/cover + - store_artifacts: + path: farmbot_telemetry/cover test_farmbot_core: <<: *defaults @@ -388,6 +422,12 @@ workflows: version: 2 test: jobs: + - test_farmbot_telemetry: + context: org-global + filters: + branches: + ignore: + - main - test_farmbot_core: context: org-global filters: diff --git a/farmbot_telemetry/coveralls.json b/farmbot_telemetry/coveralls.json new file mode 100644 index 000000000..1a39e2ed2 --- /dev/null +++ b/farmbot_telemetry/coveralls.json @@ -0,0 +1,6 @@ +{ + "coverage_options": { + "treat_no_relevant_lines_as_covered": true, + "minimum_coverage": 56 + } +} From d847167a3eccf9eab8fba8cbedd02491e1169f08 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Tue, 28 Sep 2021 11:42:40 -0500 Subject: [PATCH 04/15] Two Small Fixes (#1403) * Fix log-related pin binding issue * Fix one last SSL issue --- .../asset_workers/pin_binding_worker.ex | 16 ++++++++-------- .../asset_workers/pin_binding_worker_test.exs | 16 ++++++++++++++-- .../test/bot_state/job_progress_test.exs | 12 ++++++++++++ .../farmbot_ext/api/dirty_worker/supervisor.ex | 4 ++-- farmbot_ext/lib/farmbot_ext/api_fetcher.ex | 15 +++++++++------ farmbot_ext/lib/farmbot_ext/protocols.ex | 6 ------ .../test/farmbot_ext/api/dirty_worker_test.exs | 7 +++++++ 7 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 farmbot_core/test/bot_state/job_progress_test.exs delete mode 100644 farmbot_ext/lib/farmbot_ext/protocols.ex diff --git a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex index cd449c757..519d18607 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex @@ -68,7 +68,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do def handle_cast(:trigger, %{pin_binding: %{special_action: nil} = pin_binding} = state) do case Asset.get_sequence(pin_binding.sequence_id) do %Sequence{name: name} = seq -> - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing #{name}") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing #{name}") AST.decode(seq) |> execute(state) @@ -83,7 +83,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do :trigger, %{pin_binding: %{special_action: "emergency_lock"} = pin_binding} = state ) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Emergency Lock") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Lock") AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -95,7 +95,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do :trigger, %{pin_binding: %{special_action: "emergency_unlock"} = pin_binding} = state ) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Emergency Unlock") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Unlock") AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -104,7 +104,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do end def handle_cast(:trigger, %{pin_binding: %{special_action: "power_off"} = pin_binding} = state) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Power Off") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Power Off") AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -116,7 +116,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do :trigger, %{pin_binding: %{special_action: "read_status"} = pin_binding} = state ) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Read Status") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Read Status") AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -125,19 +125,19 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do end def handle_cast(:trigger, %{pin_binding: %{special_action: "reboot"} = pin_binding} = state) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Reboot") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Reboot") FarmbotCeleryScript.SysCalls.reboot() {:noreply, state} end def handle_cast(:trigger, %{pin_binding: %{special_action: "sync"} = pin_binding} = state) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Sync") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Sync") FarmbotCeleryScript.SysCalls.sync() {:noreply, state} end def handle_cast(:trigger, %{pin_binding: %{special_action: "take_photo"} = pin_binding} = state) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Take Photo") + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Take Photo") AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") diff --git a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs b/farmbot_core/test/asset_workers/pin_binding_worker_test.exs index 84d544e09..c3d1b72dc 100644 --- a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs +++ b/farmbot_core/test/asset_workers/pin_binding_worker_test.exs @@ -8,13 +8,25 @@ defmodule FarmbotCore.PinBindingWorkerTest do alias FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding test "triggering of a reboot from a pin binding" do - params = %{pin_binding: %{special_action: "reboot", pin_num: 0}} + params = %{ + pin_binding: %FarmbotCore.Asset.PinBinding{ + special_action: "reboot", + pin_num: 0 + } + } + expect(FarmbotCeleryScript.SysCalls, :reboot, fn -> :ok end) PinBinding.handle_cast(:trigger, params) end test "triggering of a sync from a pin binding" do - params = %{pin_binding: %{special_action: "sync", pin_num: 0}} + params = %{ + pin_binding: %FarmbotCore.Asset.PinBinding{ + special_action: "sync", + pin_num: 0 + } + } + expect(FarmbotCeleryScript.SysCalls, :sync, fn -> :ok end) PinBinding.handle_cast(:trigger, params) end diff --git a/farmbot_core/test/bot_state/job_progress_test.exs b/farmbot_core/test/bot_state/job_progress_test.exs new file mode 100644 index 000000000..115bf64cb --- /dev/null +++ b/farmbot_core/test/bot_state/job_progress_test.exs @@ -0,0 +1,12 @@ +defmodule FarmbotCore.BotState.JobProgressTest do + use ExUnit.Case + alias FarmbotCore.BotState.JobProgress + + test "serialization of percentages" do + assert inspect(%JobProgress.Percent{percent: 42}) == "#Percent<42>" + end + + test "serialization of bytes" do + assert inspect(%JobProgress.Bytes{bytes: 42}) == "#bytes<42>" + end +end diff --git a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex b/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex index 27e1e49cd..d129f45b8 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex @@ -26,8 +26,8 @@ defmodule FarmbotExt.API.DirtyWorker.Supervisor do } @doc false - def start_link(args) do - Supervisor.start_link(__MODULE__, args, name: __MODULE__) + def start_link(args, opts \\ [name: __MODULE__]) do + Supervisor.start_link(__MODULE__, args, opts) end @impl Supervisor diff --git a/farmbot_ext/lib/farmbot_ext/api_fetcher.ex b/farmbot_ext/lib/farmbot_ext/api_fetcher.ex index 33a00215f..bef471c7b 100644 --- a/farmbot_ext/lib/farmbot_ext/api_fetcher.ex +++ b/farmbot_ext/lib/farmbot_ext/api_fetcher.ex @@ -55,7 +55,7 @@ defmodule FarmbotExt.APIFetcher do url = (uri.scheme || "https") <> "://" <> uri.host <> ":" <> to_string(uri.port) user_agent = "FarmbotOS/#{@version} (#{@target}) #{@target} ()" - Tesla.client([ + middleware = [ {Tesla.Middleware.BaseUrl, url}, {Tesla.Middleware.Headers, [ @@ -63,7 +63,9 @@ defmodule FarmbotExt.APIFetcher do {"authorization", "Bearer: " <> binary_token}, {"user-agent", user_agent} ]} - ]) + ] + + Tesla.client(middleware, adapter()) end def storage_client(%StorageAuth{url: url}) do @@ -80,10 +82,7 @@ defmodule FarmbotExt.APIFetcher do {Tesla.Middleware.FormUrlencoded, []} ] - adapter = - {Tesla.Adapter.Hackney, ssl: [verify: :verify_peer, cacertfile: :certifi.cacertfile()]} - - Tesla.client(middleware, adapter) + Tesla.client(middleware, adapter()) end def upload_image(image_filename, meta \\ %{}) do @@ -189,4 +188,8 @@ defmodule FarmbotExt.APIFetcher do {:error, msg} end + + defp adapter() do + {Tesla.Adapter.Hackney, ssl: [verify: :verify_peer, cacertfile: :certifi.cacertfile()]} + end end diff --git a/farmbot_ext/lib/farmbot_ext/protocols.ex b/farmbot_ext/lib/farmbot_ext/protocols.ex deleted file mode 100644 index d406aa297..000000000 --- a/farmbot_ext/lib/farmbot_ext/protocols.ex +++ /dev/null @@ -1,6 +0,0 @@ -# TODO(Connor) delete this one day. -# this will require defining farmbot specific encode/decode -# protocols for both of these structures -require Protocol -Protocol.derive(Jason.Encoder, FarmbotExt.JWT) -Protocol.derive(Jason.Encoder, FarmbotCeleryScript.AST) diff --git a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs b/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs index a3478c995..5706fe29f 100644 --- a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs +++ b/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs @@ -12,10 +12,17 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Repo } + alias FarmbotExt.API.DirtyWorker.Supervisor + alias FarmbotExt.API.DirtyWorker setup :verify_on_exit! + test "supervisor" do + assert [] == Supervisor.children() + {:ok, _pid} = Supervisor.start_link([], []) + end + test "child spec" do spec = DirtyWorker.child_spec(Point) assert spec[:id] == {DirtyWorker, Point} From d905cabf6d882833031078a695cbcd489925bd89 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Tue, 28 Sep 2021 16:41:39 -0500 Subject: [PATCH 05/15] Module Namespace Cleanup (#1404) * Re-shuffle module namespaes to be less nested. --- farmbot_core/config/dev.exs | 4 +- farmbot_core/config/test.exs | 4 +- .../{farmbot_celery_script.ex => celery.ex} | 4 +- .../{farmbot_celery_script => celery}/ast.ex | 4 +- .../ast/factory.ex | 28 +++---- .../compiler.ex | 36 ++++---- .../compiler/utils.ex | 8 +- .../compilers/assertion_compiler.ex | 22 ++--- .../compilers/axis_control_compiler.ex | 84 +++++++++---------- .../compilers/data_control_compiler.ex | 12 +-- .../compilers/execute_compiler.ex | 8 +- .../compilers/farmware_compiler.ex | 18 ++-- .../compilers/if_compiler.ex | 24 +++--- .../compilers/lua.ex | 6 +- .../compilers/move_compiler.ex | 22 ++--- .../compilers/pin_control_compiler.ex | 22 ++--- .../compilers/rpc_request_compiler.ex | 4 +- .../compilers/scope.ex | 4 +- .../compilers/sequence_compiler.ex | 4 +- .../compilers/update_resource_compiler.ex | 18 ++-- .../compilers/variable_transformer.ex | 6 +- .../corpus.ex | 4 +- .../corpus/arg.ex | 4 +- .../corpus/node.ex | 6 +- .../dot_props.ex | 2 +- .../format_util.ex | 2 +- .../interpolation.ex | 2 +- .../runtime_error.ex | 2 +- .../scheduler.ex | 12 +-- .../special_value.ex | 4 +- .../step_runner.ex | 6 +- .../sys_calls.ex | 8 +- .../sys_calls/stubs.ex | 4 +- farmbot_core/lib/farmbot_core.ex | 2 +- .../asset_workers/device_worker.ex | 4 +- .../farm_event_worker/sequence_event.ex | 12 +-- .../asset_workers/peripheral_worker.ex | 4 +- .../asset_workers/pin_binding_worker.ex | 8 +- .../asset_workers/regimen_instance_worker.ex | 6 +- .../lib/farmbot_core/farmware_runtime.ex | 4 +- .../test/asset_workers/device_worker_test.exs | 2 +- .../asset_workers/pin_binding_worker_test.exs | 4 +- .../regimen_instance_worker_test.exs | 2 +- farmbot_core/test/dot_props_test.exs | 4 +- .../assertion_compiler_test.exs | 10 +-- .../ast/factory_test.exs | 4 +- .../test/farmbot_celery_script/ast_test.exs | 4 +- .../compiler_groups_test.exs | 8 +- .../farmbot_celery_script/compiler_test.exs | 70 ++++++++-------- .../compilers/pin_control_compilers_test.exs | 8 +- .../farmbot_celery_script/corpus/arg_test.exs | 4 +- .../corpus/node_test.exs | 4 +- .../farmbot_celery_script/corpus_test.exs | 4 +- .../integration_test.exs | 12 +-- .../lua_compiler_test.exs | 6 +- .../move_compiler_test.exs | 10 +-- .../farmbot_celery_script/scheduler_test.exs | 6 +- .../test/farmbot_celery_script/scope_test.exs | 6 +- .../special_value_test.exs | 4 +- .../farmbot_celery_script/sys_calls_test.exs | 8 +- .../variable_transformer_test.exs | 6 +- .../test/farmbot_celery_script_test.exs | 20 ++--- farmbot_core/test/interpolation_test.exs | 4 +- farmbot_core/test/stub_test.exs | 4 +- farmbot_core/test/test_helper.exs | 12 +-- farmbot_ext/config/config.exs | 6 +- farmbot_ext/lib/farmbot_ext/api/reconciler.ex | 4 +- farmbot_ext/lib/farmbot_ext/bootstrap.ex | 2 +- .../lib/farmbot_ext/bootstrap/supervisor.ex | 4 +- .../lib/farmbot_ext/{api => }/dirty_worker.ex | 6 +- .../{api => }/dirty_worker/supervisor.ex | 4 +- .../lib/farmbot_ext/{api => }/eager_loader.ex | 5 +- .../{api => }/eager_loader/supervisor.ex | 6 +- .../lib/farmbot_ext/mqtt/rpc_handler.ex | 4 +- .../farmbot_ext/mqtt/sync_handler_support.ex | 6 +- .../farmbot_ext/api/dirty_worker_test.exs | 12 +-- .../api/eager_loader_supervisor_test.exs | 4 +- .../farmbot_ext/api/eager_loader_test.exs | 10 +-- .../test/farmbot_ext/bootstrap_test.exs | 2 +- .../mqtt/sync_handler_support_test.exs | 2 +- farmbot_ext/test/test_helper.exs | 8 +- farmbot_os/config/config.exs | 3 +- .../{logger_socket => }/logger_backend.ex | 2 +- .../farmbot_os/configurator/logger_socket.ex | 2 +- farmbot_os/lib/farmbot_os/lua.ex | 2 +- .../lua/{ext => }/data_manipulation.ex | 4 +- .../lib/farmbot_os/lua/{ext => }/firmware.ex | 4 +- .../lib/farmbot_os/lua/{ext => }/info.ex | 4 +- .../lib/farmbot_os/lua/{ext => }/wait.ex | 4 +- farmbot_os/lib/farmbot_os/sys_calls.ex | 6 +- .../lib/farmbot_os/sys_calls/check_update.ex | 2 +- .../lib/farmbot_os/sys_calls/send_message.ex | 8 +- .../lua/ext/data_manipulation_test.exs | 6 +- .../test/farmbot_os/lua/ext/firmware_test.exs | 6 +- .../test/farmbot_os/lua/ext/info_test.exs | 2 +- .../test/farmbot_os/lua/ext/wait_test.exs | 6 +- farmbot_os/test/farmbot_os/lua_test.exs | 4 +- .../farmbot_os/syscalls/check_update_test.exs | 2 +- farmbot_os/test/test_helper.exs | 10 +-- 99 files changed, 413 insertions(+), 413 deletions(-) rename farmbot_core/lib/{farmbot_celery_script.ex => celery.ex} (84%) rename farmbot_core/lib/{farmbot_celery_script => celery}/ast.ex (97%) rename farmbot_core/lib/{farmbot_celery_script => celery}/ast/factory.ex (89%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compiler.ex (87%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compiler/utils.ex (92%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/assertion_compiler.ex (76%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/axis_control_compiler.ex (66%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/data_control_compiler.ex (78%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/execute_compiler.ex (75%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/farmware_compiler.ex (72%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/if_compiler.ex (83%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/lua.ex (80%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/move_compiler.ex (92%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/pin_control_compiler.ex (68%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/rpc_request_compiler.ex (80%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/scope.ex (98%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/sequence_compiler.ex (89%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/update_resource_compiler.ex (72%) rename farmbot_core/lib/{farmbot_celery_script => celery}/compilers/variable_transformer.ex (80%) rename farmbot_core/lib/{farmbot_celery_script => celery}/corpus.ex (97%) rename farmbot_core/lib/{farmbot_celery_script => celery}/corpus/arg.ex (84%) rename farmbot_core/lib/{farmbot_celery_script => celery}/corpus/node.ex (83%) rename farmbot_core/lib/{farmbot_celery_script => celery}/dot_props.ex (91%) rename farmbot_core/lib/{farmbot_celery_script => celery}/format_util.ex (92%) rename farmbot_core/lib/{farmbot_celery_script => celery}/interpolation.ex (95%) rename farmbot_core/lib/{farmbot_celery_script => celery}/runtime_error.ex (79%) rename farmbot_core/lib/{farmbot_celery_script => celery}/scheduler.ex (96%) rename farmbot_core/lib/{farmbot_celery_script => celery}/special_value.ex (95%) rename farmbot_core/lib/{farmbot_celery_script => celery}/step_runner.ex (94%) rename farmbot_core/lib/{farmbot_celery_script => celery}/sys_calls.ex (98%) rename farmbot_core/lib/{farmbot_celery_script => celery}/sys_calls/stubs.ex (97%) rename farmbot_ext/lib/farmbot_ext/{api => }/dirty_worker.ex (98%) rename farmbot_ext/lib/farmbot_ext/{api => }/dirty_worker/supervisor.ex (93%) rename farmbot_ext/lib/farmbot_ext/{api => }/eager_loader.ex (97%) rename farmbot_ext/lib/farmbot_ext/{api => }/eager_loader/supervisor.ex (88%) rename farmbot_os/lib/farmbot_os/configurator/{logger_socket => }/logger_backend.ex (94%) rename farmbot_os/lib/farmbot_os/lua/{ext => }/data_manipulation.ex (98%) rename farmbot_os/lib/farmbot_os/lua/{ext => }/firmware.ex (98%) rename farmbot_os/lib/farmbot_os/lua/{ext => }/info.ex (97%) rename farmbot_os/lib/farmbot_os/lua/{ext => }/wait.ex (82%) diff --git a/farmbot_core/config/dev.exs b/farmbot_core/config/dev.exs index d4223afa4..7ea934c7e 100644 --- a/farmbot_core/config/dev.exs +++ b/farmbot_core/config/dev.exs @@ -1,4 +1,4 @@ use Mix.Config -config :farmbot_core, FarmbotCeleryScript.SysCalls, - sys_calls: FarmbotCeleryScript.SysCalls.Stubs +config :farmbot_core, FarmbotCore.Celery.SysCalls, + sys_calls: FarmbotCore.Celery.SysCalls.Stubs diff --git a/farmbot_core/config/test.exs b/farmbot_core/config/test.exs index 72b32d4a0..045ac4fa8 100644 --- a/farmbot_core/config/test.exs +++ b/farmbot_core/config/test.exs @@ -2,8 +2,8 @@ use Mix.Config config :logger, level: :debug config :logger, :console, level: :warn -config :farmbot_core, FarmbotCeleryScript.SysCalls, - sys_calls: FarmbotCeleryScript.SysCalls.Stubs +config :farmbot_core, FarmbotCore.Celery.SysCalls, + sys_calls: FarmbotCore.Celery.SysCalls.Stubs if Mix.env() == :test do config :ex_unit, capture_logs: true diff --git a/farmbot_core/lib/farmbot_celery_script.ex b/farmbot_core/lib/celery.ex similarity index 84% rename from farmbot_core/lib/farmbot_celery_script.ex rename to farmbot_core/lib/celery.ex index 1bc48508f..054279a34 100644 --- a/farmbot_core/lib/farmbot_celery_script.ex +++ b/farmbot_core/lib/celery.ex @@ -1,9 +1,9 @@ -defmodule FarmbotCeleryScript do +defmodule FarmbotCore.Celery do @moduledoc """ Operations for Farmbot's internal scripting language. """ - alias FarmbotCeleryScript.{AST, StepRunner, Scheduler} + alias FarmbotCore.Celery.{AST, StepRunner, Scheduler} require FarmbotCore.Logger @doc "Schedule an AST to execute on a DateTime" diff --git a/farmbot_core/lib/farmbot_celery_script/ast.ex b/farmbot_core/lib/celery/ast.ex similarity index 97% rename from farmbot_core/lib/farmbot_celery_script/ast.ex rename to farmbot_core/lib/celery/ast.ex index 3b831697e..3299ad63b 100644 --- a/farmbot_core/lib/farmbot_celery_script/ast.ex +++ b/farmbot_core/lib/celery/ast.ex @@ -1,9 +1,9 @@ -defmodule FarmbotCeleryScript.AST do +defmodule FarmbotCore.Celery.AST do @moduledoc """ Handy functions for turning various data types into Farbot Celery Script Ast nodes. """ - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST @typedoc "Arguments to a ast node." @type args :: map diff --git a/farmbot_core/lib/farmbot_celery_script/ast/factory.ex b/farmbot_core/lib/celery/ast/factory.ex similarity index 89% rename from farmbot_core/lib/farmbot_celery_script/ast/factory.ex rename to farmbot_core/lib/celery/ast/factory.ex index e4a4f4f9d..2fd0c8fe2 100644 --- a/farmbot_core/lib/farmbot_celery_script/ast/factory.ex +++ b/farmbot_core/lib/celery/ast/factory.ex @@ -1,15 +1,15 @@ -defmodule FarmbotCeleryScript.AST.Factory do +defmodule FarmbotCore.Celery.AST.Factory do @moduledoc """ Helpers for creating ASTs. """ - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST @doc """ Create an empty AST WITH ARG SET TO `nil`. iex> new() - %FarmbotCeleryScript.AST{ + %FarmbotCore.Celery.AST{ args: nil, body: [], comment: nil, @@ -26,7 +26,7 @@ defmodule FarmbotCeleryScript.AST.Factory do converted to symbols. iex> new("foo") - %FarmbotCeleryScript.AST{ + %FarmbotCore.Celery.AST{ args: %{}, body: [], comment: nil, @@ -51,7 +51,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> set_pin_io_mode(13, 1)).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ kind: :set_pin_io_mode, args: %{ pin_io_mode: 1, pin_number: 13 }, body: [], @@ -66,7 +66,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> emergency_lock()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -80,7 +80,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> emergency_unlock()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -94,7 +94,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> read_status()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -108,7 +108,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> power_off()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -122,7 +122,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> reboot()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -136,7 +136,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> sync()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -150,7 +150,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> take_photo()).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ body: [], comment: nil, meta: nil, @@ -164,7 +164,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> flash_firmware("arduino")).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ kind: :flash_firmware, comment: nil, meta: nil, @@ -178,7 +178,7 @@ defmodule FarmbotCeleryScript.AST.Factory do @doc """ iex> (new() |> rpc_request("x") |> factory_reset("arduino")).body - [%FarmbotCeleryScript.AST{ + [%FarmbotCore.Celery.AST{ kind: :factory_reset, comment: nil, meta: nil, diff --git a/farmbot_core/lib/farmbot_celery_script/compiler.ex b/farmbot_core/lib/celery/compiler.ex similarity index 87% rename from farmbot_core/lib/farmbot_celery_script/compiler.ex rename to farmbot_core/lib/celery/compiler.ex index 0b062e3b2..c0c76f641 100644 --- a/farmbot_core/lib/farmbot_celery_script/compiler.ex +++ b/farmbot_core/lib/celery/compiler.ex @@ -1,11 +1,11 @@ -defmodule FarmbotCeleryScript.Compiler do +defmodule FarmbotCore.Celery.Compiler do @moduledoc """ Responsible for compiling canonical CeleryScript AST into Elixir AST. """ require Logger - alias FarmbotCeleryScript.{AST, Compiler} + alias FarmbotCore.Celery.{AST, Compiler} @doc "Returns current debug mode value" def debug_mode?() do @@ -100,7 +100,7 @@ defmodule FarmbotCeleryScript.Compiler do def nothing(_ast, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.nothing() + FarmbotCore.Celery.SysCalls.nothing() end end @@ -113,8 +113,8 @@ defmodule FarmbotCeleryScript.Compiler do def wait(%{args: %{milliseconds: millis}}, cs_scope) do quote location: :keep do with millis when is_integer(millis) <- unquote(celery_to_elixir(millis, cs_scope)) do - FarmbotCeleryScript.SysCalls.log("Waiting for #{millis} milliseconds") - FarmbotCeleryScript.SysCalls.wait(millis) + FarmbotCore.Celery.SysCalls.log("Waiting for #{millis} milliseconds") + FarmbotCore.Celery.SysCalls.wait(millis) else {:error, reason} -> {:error, reason} @@ -138,7 +138,7 @@ defmodule FarmbotCeleryScript.Compiler do end) quote location: :keep do - FarmbotCeleryScript.SysCalls.send_message( + FarmbotCore.Celery.SysCalls.send_message( unquote(celery_to_elixir(type, cs_scope)), unquote(celery_to_elixir(msg, cs_scope)), unquote(channels) @@ -148,44 +148,44 @@ defmodule FarmbotCeleryScript.Compiler do def identifier(%{args: %{label: var_name}}, _cs_scope) do quote location: :keep do - {:ok, var} = FarmbotCeleryScript.Compiler.Scope.fetch!(cs_scope, unquote(var_name)) + {:ok, var} = FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, unquote(var_name)) var end end def emergency_lock(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.emergency_lock() + FarmbotCore.Celery.SysCalls.emergency_lock() end end def emergency_unlock(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.emergency_unlock() + FarmbotCore.Celery.SysCalls.emergency_unlock() end end def read_status(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.read_status() + FarmbotCore.Celery.SysCalls.read_status() end end def sync(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.sync() + FarmbotCore.Celery.SysCalls.sync() end end def check_updates(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.check_update() + FarmbotCore.Celery.SysCalls.check_update() end end def flash_firmware(%{args: %{package: package_name}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.flash_firmware( + FarmbotCore.Celery.SysCalls.flash_firmware( unquote(celery_to_elixir(package_name, cs_scope)) ) end @@ -193,25 +193,25 @@ defmodule FarmbotCeleryScript.Compiler do def power_off(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.power_off() + FarmbotCore.Celery.SysCalls.power_off() end end def reboot(%{args: %{package: "farmbot_os"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.reboot() + FarmbotCore.Celery.SysCalls.reboot() end end def reboot(%{args: %{package: "arduino_firmware"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.firmware_reboot() + FarmbotCore.Celery.SysCalls.firmware_reboot() end end def factory_reset(%{args: %{package: package}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.factory_reset( + FarmbotCore.Celery.SysCalls.factory_reset( unquote(celery_to_elixir(package, cs_scope)) ) end @@ -232,7 +232,7 @@ defmodule FarmbotCeleryScript.Compiler do server = Map.get(pairs, "server") quote location: :keep do - FarmbotCeleryScript.SysCalls.change_ownership( + FarmbotCore.Celery.SysCalls.change_ownership( unquote(celery_to_elixir(email, cs_scope)), unquote(celery_to_elixir(secret, cs_scope)), unquote(celery_to_elixir(server, cs_scope)) diff --git a/farmbot_core/lib/farmbot_celery_script/compiler/utils.ex b/farmbot_core/lib/celery/compiler/utils.ex similarity index 92% rename from farmbot_core/lib/farmbot_celery_script/compiler/utils.ex rename to farmbot_core/lib/celery/compiler/utils.ex index dacfa418a..4809752da 100644 --- a/farmbot_core/lib/farmbot_celery_script/compiler/utils.ex +++ b/farmbot_core/lib/celery/compiler/utils.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.Utils do - alias FarmbotCeleryScript.{ +defmodule FarmbotCore.Celery.Compiler.Utils do + alias FarmbotCore.Celery.{ Compiler, AST, Compiler.Scope @@ -46,7 +46,7 @@ defmodule FarmbotCeleryScript.Compiler.Utils do front = [ quote do fn -> - FarmbotCeleryScript + FarmbotCore.Celery .SysCalls .sequence_init_log(unquote(message)) :ok @@ -56,7 +56,7 @@ defmodule FarmbotCeleryScript.Compiler.Utils do back = [ quote do fn -> - FarmbotCeleryScript + FarmbotCore.Celery .SysCalls .sequence_complete_log("Completed #{unquote(sequence_name)}") :ok diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/assertion_compiler.ex b/farmbot_core/lib/celery/compilers/assertion_compiler.ex similarity index 76% rename from farmbot_core/lib/farmbot_celery_script/compilers/assertion_compiler.ex rename to farmbot_core/lib/celery/compilers/assertion_compiler.ex index 7739b8e8f..91fa01f8e 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/assertion_compiler.ex +++ b/farmbot_core/lib/celery/compilers/assertion_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.Assertion do - alias FarmbotCeleryScript.Compiler +defmodule FarmbotCore.Celery.Compiler.Assertion do + alias FarmbotCore.Celery.Compiler @doc "`Assert` is a internal node useful for self testing." def assertion( %{ @@ -17,7 +17,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do "[Assertion] " end lua_code = Compiler.celery_to_elixir(expression, cs_scope) - result = FarmbotCeleryScript.Compiler.Lua.do_lua(lua_code, cs_scope) + result = FarmbotCore.Celery.Compiler.Lua.do_lua(lua_code, cs_scope) quote location: :keep do comment_header = unquote(comment_header) @@ -26,7 +26,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do result = unquote(result) case result do {:error, reason} -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCalls.log_assertion( false, assertion_type, "#{comment_header}failed to evaluate, aborting" @@ -35,7 +35,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do {:error, reason} {:ok, [true]} -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCalls.log_assertion( true, assertion_type, "#{comment_header}passed, continuing execution" @@ -44,7 +44,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do :ok {:ok, _} when assertion_type == "continue" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCalls.log_assertion( false, assertion_type, "#{comment_header}failed, continuing execution" @@ -53,7 +53,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do :ok {:ok, _} when assertion_type == "abort" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCalls.log_assertion( false, assertion_type, "#{comment_header}failed, aborting" @@ -62,7 +62,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do {:error, "Assertion failed (aborting)"} {:ok, _} when assertion_type == "recover" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCalls.log_assertion( false, assertion_type, "#{comment_header}failed, recovering and continuing" @@ -71,17 +71,17 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do unquote(Compiler.Utils.compile_block(then_ast, cs_scope)) {:ok, _} when assertion_type == "abort_recover" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCalls.log_assertion( false, assertion_type, "#{comment_header}failed, recovering and aborting" ) then_block = unquote(Compiler.Utils.compile_block(then_ast, cs_scope)) - abort = %FarmbotCeleryScript.AST{kind: :abort, args: %{}} + abort = %FarmbotCore.Celery.AST{kind: :abort, args: %{}} then_block ++ [ - FarmbotCeleryScript.Compiler.compile(abort, cs_scope) + FarmbotCore.Celery.Compiler.compile(abort, cs_scope) ] end end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/axis_control_compiler.ex b/farmbot_core/lib/celery/compilers/axis_control_compiler.ex similarity index 66% rename from farmbot_core/lib/farmbot_celery_script/compilers/axis_control_compiler.ex rename to farmbot_core/lib/celery/compilers/axis_control_compiler.ex index 9e55c7dd6..1e283a896 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/axis_control_compiler.ex +++ b/farmbot_core/lib/celery/compilers/axis_control_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.AxisControl do - alias FarmbotCeleryScript.Compiler +defmodule FarmbotCore.Celery.Compiler.AxisControl do + alias FarmbotCore.Celery.Compiler # Compiles move_absolute def move_absolute(%{args: %{location: location,offset: offset,speed: speed}}, cs_scope) do @@ -15,16 +15,16 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do unquote(locz) + unquote(offz) ] - x_str = FarmbotCeleryScript.FormatUtil.format_float(x) - y_str = FarmbotCeleryScript.FormatUtil.format_float(y) - z_str = FarmbotCeleryScript.FormatUtil.format_float(z) + x_str = FarmbotCore.Celery.FormatUtil.format_float(x) + y_str = FarmbotCore.Celery.FormatUtil.format_float(y) + z_str = FarmbotCore.Celery.FormatUtil.format_float(z) - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Moving to (#{x_str}, #{y_str}, #{z_str})", true ) - FarmbotCeleryScript.SysCalls.move_absolute( + FarmbotCore.Celery.SysCalls.move_absolute( x, y, z, @@ -40,25 +40,25 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do locy when is_number(locy) <- unquote(Compiler.celery_to_elixir(y, cs_scope)), locz when is_number(locz) <- unquote(Compiler.celery_to_elixir(z, cs_scope)), curx when is_number(curx) <- - FarmbotCeleryScript.SysCalls.get_current_x(), + FarmbotCore.Celery.SysCalls.get_current_x(), cury when is_number(cury) <- - FarmbotCeleryScript.SysCalls.get_current_y(), + FarmbotCore.Celery.SysCalls.get_current_y(), curz when is_number(curz) <- - FarmbotCeleryScript.SysCalls.get_current_z() do + FarmbotCore.Celery.SysCalls.get_current_z() do # Combine them x = locx + curx y = locy + cury z = locz + curz - x_str = FarmbotCeleryScript.FormatUtil.format_float(x) - y_str = FarmbotCeleryScript.FormatUtil.format_float(y) - z_str = FarmbotCeleryScript.FormatUtil.format_float(z) + x_str = FarmbotCore.Celery.FormatUtil.format_float(x) + y_str = FarmbotCore.Celery.FormatUtil.format_float(y) + z_str = FarmbotCore.Celery.FormatUtil.format_float(z) - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Moving relative to (#{x_str}, #{y_str}, #{z_str})", true ) - FarmbotCeleryScript.SysCalls.move_absolute( + FarmbotCore.Celery.SysCalls.move_absolute( x, y, z, @@ -71,11 +71,11 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do # Expands find_home(all) into three find_home/1 calls def find_home(%{args: %{axis: "all"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.log("Finding home on all axes", true) + FarmbotCore.Celery.SysCalls.log("Finding home on all axes", true) - with :ok <- FarmbotCeleryScript.SysCalls.find_home("z"), - :ok <- FarmbotCeleryScript.SysCalls.find_home("y") do - FarmbotCeleryScript.SysCalls.find_home("x") + with :ok <- FarmbotCore.Celery.SysCalls.find_home("z"), + :ok <- FarmbotCore.Celery.SysCalls.find_home("y") do + FarmbotCore.Celery.SysCalls.find_home("x") end end end @@ -85,12 +85,12 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do quote location: :keep do with axis when axis in ["x", "y", "z"] <- unquote(Compiler.celery_to_elixir(axis, cs_scope)) do - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Finding home on the #{String.upcase(axis)} axis", true ) - FarmbotCeleryScript.SysCalls.find_home(axis) + FarmbotCore.Celery.SysCalls.find_home(axis) else {:error, reason} -> {:error, reason} @@ -101,13 +101,13 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do # Expands home(all) into three home/1 calls def home(%{args: %{axis: "all", speed: speed}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.log("Going to home on all axes", true) + FarmbotCore.Celery.SysCalls.log("Going to home on all axes", true) with speed when is_number(speed) <- unquote(Compiler.celery_to_elixir(speed, cs_scope)), - :ok <- FarmbotCeleryScript.SysCalls.home("z", speed), - :ok <- FarmbotCeleryScript.SysCalls.home("y", speed) do - FarmbotCeleryScript.SysCalls.home("x", speed) + :ok <- FarmbotCore.Celery.SysCalls.home("z", speed), + :ok <- FarmbotCore.Celery.SysCalls.home("y", speed) do + FarmbotCore.Celery.SysCalls.home("x", speed) end end end @@ -119,12 +119,12 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do unquote(Compiler.celery_to_elixir(axis, cs_scope)), speed when is_number(speed) <- unquote(Compiler.celery_to_elixir(speed, cs_scope)) do - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Going to home on the #{String.upcase(axis)} axis", true ) - FarmbotCeleryScript.SysCalls.home(axis, speed) + FarmbotCore.Celery.SysCalls.home(axis, speed) else {:error, reason} -> {:error, reason} @@ -135,11 +135,11 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do # Expands zero(all) into three zero/1 calls def zero(%{args: %{axis: "all"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.log("Setting home for all axes", true) + FarmbotCore.Celery.SysCalls.log("Setting home for all axes", true) - with :ok <- FarmbotCeleryScript.SysCalls.zero("z"), - :ok <- FarmbotCeleryScript.SysCalls.zero("y") do - FarmbotCeleryScript.SysCalls.zero("x") + with :ok <- FarmbotCore.Celery.SysCalls.zero("z"), + :ok <- FarmbotCore.Celery.SysCalls.zero("y") do + FarmbotCore.Celery.SysCalls.zero("x") end end end @@ -149,12 +149,12 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do quote location: :keep do with axis when axis in ["x", "y", "z"] <- unquote(Compiler.celery_to_elixir(axis, cs_scope)) do - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Setting home for the #{String.upcase(axis)} axis", true ) - FarmbotCeleryScript.SysCalls.zero(axis) + FarmbotCore.Celery.SysCalls.zero(axis) else {:error, reason} -> {:error, reason} @@ -165,11 +165,11 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do # Expands calibrate(all) into three calibrate/1 calls def calibrate(%{args: %{axis: "all"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.log("Finding length of all axes", true) + FarmbotCore.Celery.SysCalls.log("Finding length of all axes", true) - with :ok <- FarmbotCeleryScript.SysCalls.calibrate("z"), - :ok <- FarmbotCeleryScript.SysCalls.calibrate("y") do - FarmbotCeleryScript.SysCalls.calibrate("x") + with :ok <- FarmbotCore.Celery.SysCalls.calibrate("z"), + :ok <- FarmbotCore.Celery.SysCalls.calibrate("y") do + FarmbotCore.Celery.SysCalls.calibrate("x") else {:error, reason} -> {:error, reason} end @@ -182,8 +182,8 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do with axis when axis in ["x", "y", "z"] <- unquote(Compiler.celery_to_elixir(axis, cs_scope)) do msg = "Determining length of the #{String.upcase(axis)} axis" - FarmbotCeleryScript.SysCalls.log(msg, true) - FarmbotCeleryScript.SysCalls.calibrate(axis) + FarmbotCore.Celery.SysCalls.log(msg, true) + FarmbotCore.Celery.SysCalls.calibrate(axis) else {:error, reason} -> {:error, reason} end @@ -192,7 +192,7 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do defp cs_to_xyz(%{kind: :identifier} = ast, cs_scope) do label = ast.args.label - {:ok, variable} = FarmbotCeleryScript.Compiler.Scope.fetch!(cs_scope, label) + {:ok, variable} = FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, label) # Prevent circular refernces. # I doubt end users would intentionally do this, so treat # it like an error. @@ -205,13 +205,13 @@ defmodule FarmbotCeleryScript.Compiler.AxisControl do end defp cs_to_xyz(%{kind: :tool, args: args}, _) do - slot = FarmbotCeleryScript.SysCalls.get_toolslot_for_tool(args.tool_id) + slot = FarmbotCore.Celery.SysCalls.get_toolslot_for_tool(args.tool_id) vec_map_to_array(slot) end defp cs_to_xyz(%{kind: :point} = ast, _) do %{ pointer_type: t, pointer_id: id } = ast.args - vec_map_to_array(FarmbotCeleryScript.SysCalls.point(t, id)) + vec_map_to_array(FarmbotCore.Celery.SysCalls.point(t, id)) end defp cs_to_xyz(other, _), do: raise "Unexpected location or offset: #{inspect(other)}" diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/data_control_compiler.ex b/farmbot_core/lib/celery/compilers/data_control_compiler.ex similarity index 78% rename from farmbot_core/lib/farmbot_celery_script/compilers/data_control_compiler.ex rename to farmbot_core/lib/celery/compilers/data_control_compiler.ex index caaadc9e2..e6caa63c2 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/data_control_compiler.ex +++ b/farmbot_core/lib/celery/compilers/data_control_compiler.ex @@ -1,11 +1,11 @@ -defmodule FarmbotCeleryScript.Compiler.DataControl do - alias FarmbotCeleryScript.Compiler +defmodule FarmbotCore.Celery.Compiler.DataControl do + alias FarmbotCore.Celery.Compiler # compiles coordinate # Coordinate should return a vec3 def coordinate(%{args: %{x: x, y: y, z: z}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.coordinate( + FarmbotCore.Celery.SysCalls.coordinate( unquote(Compiler.celery_to_elixir(x, cs_scope)), unquote(Compiler.celery_to_elixir(y, cs_scope)), unquote(Compiler.celery_to_elixir(z, cs_scope)) @@ -16,7 +16,7 @@ defmodule FarmbotCeleryScript.Compiler.DataControl do # compiles point def point(%{args: %{pointer_type: type, pointer_id: id}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.point( + FarmbotCore.Celery.SysCalls.point( unquote(Compiler.celery_to_elixir(type, cs_scope)), unquote(Compiler.celery_to_elixir(id, cs_scope)) ) @@ -26,7 +26,7 @@ defmodule FarmbotCeleryScript.Compiler.DataControl do # compile a named pin def named_pin(%{args: %{pin_id: id, pin_type: type}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.named_pin( + FarmbotCore.Celery.SysCalls.named_pin( unquote(Compiler.celery_to_elixir(type, cs_scope)), unquote(Compiler.celery_to_elixir(id, cs_scope)) ) @@ -35,7 +35,7 @@ defmodule FarmbotCeleryScript.Compiler.DataControl do def tool(%{args: %{tool_id: tool_id}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.get_toolslot_for_tool( + FarmbotCore.Celery.SysCalls.get_toolslot_for_tool( unquote(Compiler.celery_to_elixir(tool_id, cs_scope)) ) end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/execute_compiler.ex b/farmbot_core/lib/celery/compilers/execute_compiler.ex similarity index 75% rename from farmbot_core/lib/farmbot_celery_script/compilers/execute_compiler.ex rename to farmbot_core/lib/celery/compilers/execute_compiler.ex index 82f33a533..8727211fa 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/execute_compiler.ex +++ b/farmbot_core/lib/celery/compilers/execute_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.Execute do - alias FarmbotCeleryScript.{ +defmodule FarmbotCore.Celery.Compiler.Execute do + alias FarmbotCore.Celery.{ AST, Compiler.Scope } @@ -14,13 +14,13 @@ defmodule FarmbotCeleryScript.Compiler.Execute do defp do_execute(execute_ast, previous_scope) do id = execute_ast.args.sequence_id - case FarmbotCeleryScript.SysCalls.get_sequence(id) do + case FarmbotCore.Celery.SysCalls.get_sequence(id) do %AST{kind: :sequence} = sequence_ast -> quote location: :keep do # execute_compiler.ex sequence = unquote(sequence_ast) cs_scope = unquote(Scope.new(previous_scope, execute_ast.body)) - FarmbotCeleryScript.Compiler.Sequence.sequence(sequence, cs_scope) + FarmbotCore.Celery.Compiler.Sequence.sequence(sequence, cs_scope) end error -> error diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/farmware_compiler.ex b/farmbot_core/lib/celery/compilers/farmware_compiler.ex similarity index 72% rename from farmbot_core/lib/farmbot_celery_script/compilers/farmware_compiler.ex rename to farmbot_core/lib/celery/compilers/farmware_compiler.ex index c763c5da7..2e3ea8bef 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/farmware_compiler.ex +++ b/farmbot_core/lib/celery/compilers/farmware_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.Farmware do - alias FarmbotCeleryScript.Compiler +defmodule FarmbotCore.Celery.Compiler.Farmware do + alias FarmbotCore.Celery.Compiler def take_photo(%{body: params}, cs_scope) do execute_script(%{args: %{label: "take-photo"}, body: params}, cs_scope) @@ -14,15 +14,15 @@ defmodule FarmbotCeleryScript.Compiler.Farmware do quote location: :keep do package = unquote(Compiler.celery_to_elixir(package, cs_scope)) env = unquote(Macro.escape(Map.new(env))) - FarmbotCeleryScript.SysCalls.log(unquote(format_log(package)), true) - FarmbotCeleryScript.SysCalls.execute_script(package, env) + FarmbotCore.Celery.SysCalls.log(unquote(format_log(package)), true) + FarmbotCore.Celery.SysCalls.execute_script(package, env) end end def install_first_party_farmware(_, _) do quote location: :keep do - FarmbotCeleryScript.SysCalls.log("Installing dependencies...") - FarmbotCeleryScript.SysCalls.install_first_party_farmware() + FarmbotCore.Celery.SysCalls.log("Installing dependencies...") + FarmbotCore.Celery.SysCalls.install_first_party_farmware() end end @@ -30,7 +30,7 @@ defmodule FarmbotCeleryScript.Compiler.Farmware do kvs = Enum.map(pairs, fn %{kind: :pair, args: %{label: key, value: value}} -> quote location: :keep do - FarmbotCeleryScript.SysCalls.set_user_env( + FarmbotCore.Celery.SysCalls.set_user_env( unquote(key), unquote(value) ) @@ -45,8 +45,8 @@ defmodule FarmbotCeleryScript.Compiler.Farmware do def update_farmware(%{args: %{package: package}}, cs_scope) do quote location: :keep do package = unquote(Compiler.celery_to_elixir(package, cs_scope)) - FarmbotCeleryScript.SysCalls.log("Updating Farmware: #{package}", true) - FarmbotCeleryScript.SysCalls.update_farmware(package) + FarmbotCore.Celery.SysCalls.log("Updating Farmware: #{package}", true) + FarmbotCore.Celery.SysCalls.update_farmware(package) end end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/if_compiler.ex b/farmbot_core/lib/celery/compilers/if_compiler.ex similarity index 83% rename from farmbot_core/lib/farmbot_celery_script/compilers/if_compiler.ex rename to farmbot_core/lib/celery/compilers/if_compiler.ex index 5b7d037d5..5f1004e5c 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/if_compiler.ex +++ b/farmbot_core/lib/celery/compilers/if_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.If do - alias FarmbotCeleryScript.{AST, Compiler} +defmodule FarmbotCore.Celery.Compiler.If do + alias FarmbotCore.Celery.{AST, Compiler} # Compiles an if statement. def unquote(:_if)( @@ -23,20 +23,20 @@ defmodule FarmbotCeleryScript.Compiler.If do case lhs_ast do "x" -> quote [location: :keep], - do: FarmbotCeleryScript.SysCalls.get_cached_x() + do: FarmbotCore.Celery.SysCalls.get_cached_x() "y" -> quote [location: :keep], - do: FarmbotCeleryScript.SysCalls.get_cached_y() + do: FarmbotCore.Celery.SysCalls.get_cached_y() "z" -> quote [location: :keep], - do: FarmbotCeleryScript.SysCalls.get_cached_z() + do: FarmbotCore.Celery.SysCalls.get_cached_z() "pin" <> pin -> quote [location: :keep], do: - FarmbotCeleryScript.SysCalls.read_cached_pin( + FarmbotCore.Celery.SysCalls.read_cached_pin( unquote(String.to_integer(pin)) ) @@ -45,7 +45,7 @@ defmodule FarmbotCeleryScript.Compiler.If do %AST{kind: :named_pin} = ast -> quote [location: :keep], do: - FarmbotCeleryScript.SysCalls.read_cached_pin( + FarmbotCore.Celery.SysCalls.read_cached_pin( unquote(Compiler.celery_to_elixir(ast, cs_scope)) ) @@ -118,7 +118,7 @@ defmodule FarmbotCeleryScript.Compiler.If do # nothing() # end quote location: :keep do - prefix_string = FarmbotCeleryScript.SysCalls.format_lhs(unquote(lhs_ast)) + prefix_string = FarmbotCore.Celery.SysCalls.format_lhs(unquote(lhs_ast)) # examples: # "current x position is 100" # "pin 13 > 1" @@ -133,17 +133,17 @@ defmodule FarmbotCeleryScript.Compiler.If do end if unquote(if_eval) do - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Evaluated IF statement: #{result_str}; #{unquote(truthy_suffix)}" ) - unquote(FarmbotCeleryScript.Compiler.Utils.compile_block(then_ast, cs_scope)) + unquote(FarmbotCore.Celery.Compiler.Utils.compile_block(then_ast, cs_scope)) else - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCalls.log( "Evaluated IF statement: #{result_str}; #{unquote(falsey_suffix)}" ) - unquote(FarmbotCeleryScript.Compiler.Utils.compile_block(else_ast, cs_scope)) + unquote(FarmbotCore.Celery.Compiler.Utils.compile_block(else_ast, cs_scope)) end end end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/lua.ex b/farmbot_core/lib/celery/compilers/lua.ex similarity index 80% rename from farmbot_core/lib/farmbot_celery_script/compilers/lua.ex rename to farmbot_core/lib/celery/compilers/lua.ex index 970a37b58..6c9762735 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/lua.ex +++ b/farmbot_core/lib/celery/compilers/lua.ex @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.Compiler.Lua do - alias FarmbotCeleryScript.SysCalls - alias FarmbotCeleryScript.Compiler.{ VariableTransformer, Scope, } +defmodule FarmbotCore.Celery.Compiler.Lua do + alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.Compiler.{ VariableTransformer, Scope, } def lua(%{args: %{lua: lua}}, cs_scope) do quote location: :keep do diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/move_compiler.ex b/farmbot_core/lib/celery/compilers/move_compiler.ex similarity index 92% rename from farmbot_core/lib/farmbot_celery_script/compilers/move_compiler.ex rename to farmbot_core/lib/celery/compilers/move_compiler.ex index dfce9db6e..75534591c 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/move_compiler.ex +++ b/farmbot_core/lib/celery/compilers/move_compiler.ex @@ -1,7 +1,7 @@ -defmodule FarmbotCeleryScript.Compiler.Move do - alias FarmbotCeleryScript.SysCalls - alias FarmbotCeleryScript.SpecialValue - alias FarmbotCeleryScript.Compiler.Scope +defmodule FarmbotCore.Celery.Compiler.Move do + alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SpecialValue + alias FarmbotCore.Celery.Compiler.Scope def move(%{body: body}, cs_scope) do quote location: :keep do @@ -116,7 +116,7 @@ defmodule FarmbotCeleryScript.Compiler.Move do # Z height. If X/Y values were to change, it # would invalidate the Z height calculation. def create_list_of_operations(body) do - mapper = &FarmbotCeleryScript.Compiler.Move.mapper/1 + mapper = &FarmbotCore.Celery.Compiler.Move.mapper/1 # Move X/Y operations to the front of the list and move # Z operations to the back, but DO NOT SORT!: {xy, z} = initial_state() ++ Enum.map(body, mapper) @@ -243,7 +243,7 @@ defmodule FarmbotCeleryScript.Compiler.Move do end def to_number(axis, %{kind: :tool, args: %{tool_id: id}}) do - tool = FarmbotCeleryScript.SysCalls.get_toolslot_for_tool(id) + tool = FarmbotCore.Celery.SysCalls.get_toolslot_for_tool(id) to_number(axis, tool) end @@ -252,12 +252,12 @@ defmodule FarmbotCeleryScript.Compiler.Move do end def move_abs(%{x: x, y: y, z: z, speed_x: sx, speed_y: sy, speed_z: sz} = k) do - x_str = FarmbotCeleryScript.FormatUtil.format_float(x) - y_str = FarmbotCeleryScript.FormatUtil.format_float(y) - z_str = FarmbotCeleryScript.FormatUtil.format_float(z) + x_str = FarmbotCore.Celery.FormatUtil.format_float(x) + y_str = FarmbotCore.Celery.FormatUtil.format_float(y) + z_str = FarmbotCore.Celery.FormatUtil.format_float(z) msg = "Moving to (#{x_str}, #{y_str}, #{z_str})" - FarmbotCeleryScript.SysCalls.log(msg, true) + FarmbotCore.Celery.SysCalls.log(msg, true) :ok = SysCalls.move_absolute(x, y, z, sx, sy, sz) k end @@ -267,7 +267,7 @@ defmodule FarmbotCeleryScript.Compiler.Move do def cz, do: SysCalls.get_current_z() def convert_lua_to_number(lua, cs_scope) do - case FarmbotCeleryScript.Compiler.Lua.do_lua(lua, cs_scope) do + case FarmbotCore.Celery.Compiler.Lua.do_lua(lua, cs_scope) do {:ok, [data]} -> if is_number(data) do data diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/pin_control_compiler.ex b/farmbot_core/lib/celery/compilers/pin_control_compiler.ex similarity index 68% rename from farmbot_core/lib/farmbot_celery_script/compilers/pin_control_compiler.ex rename to farmbot_core/lib/celery/compilers/pin_control_compiler.ex index 5278a70b6..90753b5a6 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/pin_control_compiler.ex +++ b/farmbot_core/lib/celery/compilers/pin_control_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.PinControl do - alias FarmbotCeleryScript.Compiler +defmodule FarmbotCore.Celery.Compiler.PinControl do + alias FarmbotCore.Celery.Compiler def write_pin(%{args: %{pin_number: num, pin_mode: mode, pin_value: value}}, cs_scope) do quote location: :keep do @@ -7,7 +7,7 @@ defmodule FarmbotCeleryScript.Compiler.PinControl do mode = unquote(Compiler.celery_to_elixir(mode, cs_scope)) value = unquote(Compiler.celery_to_elixir(value, cs_scope)) - with :ok <- FarmbotCeleryScript.SysCalls.write_pin(pin, mode, value) do + with :ok <- FarmbotCore.Celery.SysCalls.write_pin(pin, mode, value) do me = unquote(__MODULE__) me.conclude(pin, mode, value) end @@ -19,7 +19,7 @@ defmodule FarmbotCeleryScript.Compiler.PinControl do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(num, cs_scope)) mode = unquote(Compiler.celery_to_elixir(mode, cs_scope)) - FarmbotCeleryScript.SysCalls.read_pin(pin, mode) + FarmbotCore.Celery.SysCalls.read_pin(pin, mode) end end @@ -29,8 +29,8 @@ defmodule FarmbotCeleryScript.Compiler.PinControl do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(pin_number, cs_scope)) angle = unquote(Compiler.celery_to_elixir(pin_value, cs_scope)) - FarmbotCeleryScript.SysCalls.log("Writing servo: #{pin}: #{angle}") - FarmbotCeleryScript.SysCalls.set_servo_angle(pin, angle) + FarmbotCore.Celery.SysCalls.log("Writing servo: #{pin}: #{angle}") + FarmbotCore.Celery.SysCalls.set_servo_angle(pin, angle) end end @@ -40,22 +40,22 @@ defmodule FarmbotCeleryScript.Compiler.PinControl do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(pin_number, cs_scope)) mode = unquote(Compiler.celery_to_elixir(mode, cs_scope)) - FarmbotCeleryScript.SysCalls.log("Setting pin mode: #{pin}: #{mode}") - FarmbotCeleryScript.SysCalls.set_pin_io_mode(pin, mode) + FarmbotCore.Celery.SysCalls.log("Setting pin mode: #{pin}: #{mode}") + FarmbotCore.Celery.SysCalls.set_pin_io_mode(pin, mode) end end def toggle_pin(%{args: %{pin_number: pin_number}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.toggle_pin(unquote(pin_number)) + FarmbotCore.Celery.SysCalls.toggle_pin(unquote(pin_number)) end end def conclude(pin, 0, _value) do - FarmbotCeleryScript.SysCalls.read_pin(pin, 0) + FarmbotCore.Celery.SysCalls.read_pin(pin, 0) end def conclude(pin, _mode, value) do - FarmbotCeleryScript.SysCalls.log("Pin #{pin} is #{value} (analog)") + FarmbotCore.Celery.SysCalls.log("Pin #{pin} is #{value} (analog)") end end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/rpc_request_compiler.ex b/farmbot_core/lib/celery/compilers/rpc_request_compiler.ex similarity index 80% rename from farmbot_core/lib/farmbot_celery_script/compilers/rpc_request_compiler.ex rename to farmbot_core/lib/celery/compilers/rpc_request_compiler.ex index aa90ed1b9..52b354222 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/rpc_request_compiler.ex +++ b/farmbot_core/lib/celery/compilers/rpc_request_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.RPCRequest do - alias FarmbotCeleryScript.Compiler.Utils +defmodule FarmbotCore.Celery.Compiler.RPCRequest do + alias FarmbotCore.Celery.Compiler.Utils def rpc_request(%{args: %{label: _label}, body: block}, cs_scope) do steps = Utils.compile_block(block, cs_scope) |> Utils.decompose_block_to_steps() diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/scope.ex b/farmbot_core/lib/celery/compilers/scope.ex similarity index 98% rename from farmbot_core/lib/farmbot_celery_script/compilers/scope.ex rename to farmbot_core/lib/celery/compilers/scope.ex index 952912993..3ee76d6f7 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/scope.ex +++ b/farmbot_core/lib/celery/compilers/scope.ex @@ -1,8 +1,8 @@ # Manages state related to CeleryScript's variable scoping. # These structs are passed between CeleryScript nodes to store # variable names and values. -defmodule FarmbotCeleryScript.Compiler.Scope do - alias FarmbotCeleryScript.AST +defmodule FarmbotCore.Celery.Compiler.Scope do + alias FarmbotCore.Celery.AST defstruct [ # 25 July 2021: I might remove this later to have scope diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/sequence_compiler.ex b/farmbot_core/lib/celery/compilers/sequence_compiler.ex similarity index 89% rename from farmbot_core/lib/farmbot_celery_script/compilers/sequence_compiler.ex rename to farmbot_core/lib/celery/compilers/sequence_compiler.ex index 9f9cb1b84..caa6b5527 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/sequence_compiler.ex +++ b/farmbot_core/lib/celery/compilers/sequence_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.Sequence do - alias FarmbotCeleryScript.Compiler.{ Scope, Utils } +defmodule FarmbotCore.Celery.Compiler.Sequence do + alias FarmbotCore.Celery.Compiler.{ Scope, Utils } def sequence(ast, cs_scope) do sequence_header = ast.args.locals.body # Apply defaults declared by sequence diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/update_resource_compiler.ex b/farmbot_core/lib/celery/compilers/update_resource_compiler.ex similarity index 72% rename from farmbot_core/lib/farmbot_celery_script/compilers/update_resource_compiler.ex rename to farmbot_core/lib/celery/compilers/update_resource_compiler.ex index 684822d63..9ec1d9ae3 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/update_resource_compiler.ex +++ b/farmbot_core/lib/celery/compilers/update_resource_compiler.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Compiler.UpdateResource do - alias FarmbotCeleryScript.{AST, DotProps} +defmodule FarmbotCore.Celery.Compiler.UpdateResource do + alias FarmbotCore.Celery.{AST, DotProps} def update_resource(%AST{args: args, body: body}, cs_scope) do update = unpair(body, %{}) @@ -9,16 +9,16 @@ defmodule FarmbotCeleryScript.Compiler.UpdateResource do update = unquote(update) cs_scope = unquote(cs_scope) case variable do - %FarmbotCeleryScript.AST{kind: :identifier} -> + %FarmbotCore.Celery.AST{kind: :identifier} -> args = Map.fetch!(variable, :args) label = Map.fetch!(args, :label) - {:ok, resource} = FarmbotCeleryScript.Compiler.Scope.fetch!(cs_scope, label) + {:ok, resource} = FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, label) me.do_update(resource, update) - %FarmbotCeleryScript.AST{kind: :point} -> + %FarmbotCore.Celery.AST{kind: :point} -> me.do_update(variable.args(), update) - %FarmbotCeleryScript.AST{kind: :resource} -> + %FarmbotCore.Celery.AST{kind: :resource} -> me.do_update(variable.args(), update) res -> @@ -28,15 +28,15 @@ defmodule FarmbotCeleryScript.Compiler.UpdateResource do end def do_update(%{pointer_id: id, pointer_type: kind}, update_params) do - FarmbotCeleryScript.SysCalls.update_resource(kind, id, update_params) + FarmbotCore.Celery.SysCalls.update_resource(kind, id, update_params) end def do_update(%{resource_id: id, resource_type: kind}, update_params) do - FarmbotCeleryScript.SysCalls.update_resource(kind, id, update_params) + FarmbotCore.Celery.SysCalls.update_resource(kind, id, update_params) end def do_update(%{args: %{pointer_id: id, pointer_type: k}}, update_params) do - FarmbotCeleryScript.SysCalls.update_resource(k, id, update_params) + FarmbotCore.Celery.SysCalls.update_resource(k, id, update_params) end def do_update(other, update) do diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/variable_transformer.ex b/farmbot_core/lib/celery/compilers/variable_transformer.ex similarity index 80% rename from farmbot_core/lib/farmbot_celery_script/compilers/variable_transformer.ex rename to farmbot_core/lib/celery/compilers/variable_transformer.ex index 9615ad92e..1506ecb5f 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/variable_transformer.ex +++ b/farmbot_core/lib/celery/compilers/variable_transformer.ex @@ -1,7 +1,7 @@ # Ensure that every "location like" CeleryScript variable has # an x/y/z property at the root of the object. -defmodule FarmbotCeleryScript.Compiler.VariableTransformer do - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotCore.Celery.Compiler.VariableTransformer do + alias FarmbotCore.Celery.SysCalls def run!(%{ resource_id: id, resource_type: t }) do [SysCalls.point(t, id)] @@ -19,7 +19,7 @@ defmodule FarmbotCeleryScript.Compiler.VariableTransformer do end def run!(%{args: %{tool_id: tool_id}}) do - [FarmbotCeleryScript.SysCalls.get_toolslot_for_tool(tool_id)] + [FarmbotCore.Celery.SysCalls.get_toolslot_for_tool(tool_id)] end def run!(nil) do diff --git a/farmbot_core/lib/farmbot_celery_script/corpus.ex b/farmbot_core/lib/celery/corpus.ex similarity index 97% rename from farmbot_core/lib/farmbot_celery_script/corpus.ex rename to farmbot_core/lib/celery/corpus.ex index 88b574c82..3a30f4d5a 100644 --- a/farmbot_core/lib/farmbot_celery_script/corpus.ex +++ b/farmbot_core/lib/celery/corpus.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.Corpus do - alias FarmbotCeleryScript.{Corpus, Corpus.Node, Corpus.Arg} +defmodule FarmbotCore.Celery.Corpus do + alias FarmbotCore.Celery.{Corpus, Corpus.Node, Corpus.Arg} @corpus_file "fixture/corpus.json" @external_resource @corpus_file diff --git a/farmbot_core/lib/farmbot_celery_script/corpus/arg.ex b/farmbot_core/lib/celery/corpus/arg.ex similarity index 84% rename from farmbot_core/lib/farmbot_celery_script/corpus/arg.ex rename to farmbot_core/lib/celery/corpus/arg.ex index e291c301f..1f6d2cbd8 100644 --- a/farmbot_core/lib/farmbot_celery_script/corpus/arg.ex +++ b/farmbot_core/lib/celery/corpus/arg.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.Corpus.Arg do +defmodule FarmbotCore.Celery.Corpus.Arg do @moduledoc """ Type information about a CeleryScript Arg on the Corpus. """ @@ -9,7 +9,7 @@ defmodule FarmbotCeleryScript.Corpus.Arg do @type value :: String.t() @type doc :: String.t() - @type t :: %FarmbotCeleryScript.Corpus.Arg{ + @type t :: %FarmbotCore.Celery.Corpus.Arg{ name: name(), allowed_values: [value], doc: doc() diff --git a/farmbot_core/lib/farmbot_celery_script/corpus/node.ex b/farmbot_core/lib/celery/corpus/node.ex similarity index 83% rename from farmbot_core/lib/farmbot_celery_script/corpus/node.ex rename to farmbot_core/lib/celery/corpus/node.ex index 2cf5a4592..d4f59d034 100644 --- a/farmbot_core/lib/farmbot_celery_script/corpus/node.ex +++ b/farmbot_core/lib/celery/corpus/node.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.Corpus.Node do +defmodule FarmbotCore.Celery.Corpus.Node do @moduledoc """ Type information about a CeleryScript Node on the Corpus. """ @@ -9,10 +9,10 @@ defmodule FarmbotCeleryScript.Corpus.Node do @type body_type :: String.t() @type doc :: String.t() - @type t :: %FarmbotCeleryScript.Corpus.Node{ + @type t :: %FarmbotCore.Celery.Corpus.Node{ name: name(), doc: doc, - allowed_args: FarmbotCeleryScript.Corpus.Arg.name(), + allowed_args: FarmbotCore.Celery.Corpus.Arg.name(), allowed_body_types: body_type() } diff --git a/farmbot_core/lib/farmbot_celery_script/dot_props.ex b/farmbot_core/lib/celery/dot_props.ex similarity index 91% rename from farmbot_core/lib/farmbot_celery_script/dot_props.ex rename to farmbot_core/lib/celery/dot_props.ex index e927d3077..35e7a9cd6 100644 --- a/farmbot_core/lib/farmbot_celery_script/dot_props.ex +++ b/farmbot_core/lib/celery/dot_props.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.DotProps do +defmodule FarmbotCore.Celery.DotProps do @dot "." @doc ~S""" Takes a "dotted" key and val. diff --git a/farmbot_core/lib/farmbot_celery_script/format_util.ex b/farmbot_core/lib/celery/format_util.ex similarity index 92% rename from farmbot_core/lib/farmbot_celery_script/format_util.ex rename to farmbot_core/lib/celery/format_util.ex index 25cfd4273..68132f18a 100644 --- a/farmbot_core/lib/farmbot_celery_script/format_util.ex +++ b/farmbot_core/lib/celery/format_util.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.FormatUtil do +defmodule FarmbotCore.Celery.FormatUtil do def format_float(nil), do: nil def format_float(value) when is_integer(value) do diff --git a/farmbot_core/lib/farmbot_celery_script/interpolation.ex b/farmbot_core/lib/celery/interpolation.ex similarity index 95% rename from farmbot_core/lib/farmbot_celery_script/interpolation.ex rename to farmbot_core/lib/celery/interpolation.ex index be70069aa..76be3904d 100644 --- a/farmbot_core/lib/farmbot_celery_script/interpolation.ex +++ b/farmbot_core/lib/celery/interpolation.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.Interpolation do +defmodule FarmbotCore.Celery.Interpolation do # Given the current X/Y position and a list of soil height samples, provides # the current Z coordinate via inverse distance weighting. def guess_z_value(soil_points, current_xy) do diff --git a/farmbot_core/lib/farmbot_celery_script/runtime_error.ex b/farmbot_core/lib/celery/runtime_error.ex similarity index 79% rename from farmbot_core/lib/farmbot_celery_script/runtime_error.ex rename to farmbot_core/lib/celery/runtime_error.ex index 45c47c7d0..c77235e4c 100644 --- a/farmbot_core/lib/farmbot_celery_script/runtime_error.ex +++ b/farmbot_core/lib/celery/runtime_error.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.RuntimeError do +defmodule FarmbotCore.Celery.RuntimeError do @moduledoc """ CeleryScript error raised when a syscall fails. Examples of this include a movement failed, a resource was unavailable, etc. diff --git a/farmbot_core/lib/farmbot_celery_script/scheduler.ex b/farmbot_core/lib/celery/scheduler.ex similarity index 96% rename from farmbot_core/lib/farmbot_celery_script/scheduler.ex rename to farmbot_core/lib/celery/scheduler.ex index bf136a054..433570fb6 100644 --- a/farmbot_core/lib/farmbot_celery_script/scheduler.ex +++ b/farmbot_core/lib/celery/scheduler.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.Scheduler do +defmodule FarmbotCore.Celery.Scheduler do @moduledoc """ Handles execution of CeleryScript. @@ -7,7 +7,7 @@ defmodule FarmbotCeleryScript.Scheduler do A message will arrive in the callers inbox after either shaped like - {FarmbotCeleryScript.Scheduler, result} + {FarmbotCore.Celery.Scheduler, result} where result will be @@ -20,7 +20,7 @@ defmodule FarmbotCeleryScript.Scheduler do use GenServer require Logger require FarmbotCore.Logger - alias FarmbotCeleryScript.{AST, Scheduler, StepRunner} + alias FarmbotCore.Celery.{AST, Scheduler, StepRunner} alias Scheduler, as: State # 15 minutes @@ -174,7 +174,7 @@ defmodule FarmbotCeleryScript.Scheduler do ) do send( pid, - {FarmbotCeleryScript, + {FarmbotCore.Celery, {:scheduled_execution, scheduled_at, executed_at, result}} ) @@ -323,11 +323,11 @@ defmodule FarmbotCeleryScript.Scheduler do case Registry.meta(name, {:last_calendar, pid}) do {:ok, ^calendar} -> Logger.debug("calendar for #{inspect(pid)} hasn't changed") - {FarmbotCeleryScript, {:calendar, calendar}} + {FarmbotCore.Celery, {:calendar, calendar}} _old_calendar -> Registry.put_meta(name, {:last_calendar, pid}, calendar) - send(pid, {FarmbotCeleryScript, {:calendar, calendar}}) + send(pid, {FarmbotCore.Celery, {:calendar, calendar}}) end end end diff --git a/farmbot_core/lib/farmbot_celery_script/special_value.ex b/farmbot_core/lib/celery/special_value.ex similarity index 95% rename from farmbot_core/lib/farmbot_celery_script/special_value.ex rename to farmbot_core/lib/celery/special_value.ex index 09283414c..f37c08b28 100644 --- a/farmbot_core/lib/farmbot_celery_script/special_value.ex +++ b/farmbot_core/lib/celery/special_value.ex @@ -1,5 +1,5 @@ -defmodule FarmbotCeleryScript.SpecialValue do - alias FarmbotCeleryScript.Interpolation +defmodule FarmbotCore.Celery.SpecialValue do + alias FarmbotCore.Celery.Interpolation alias FarmbotCore.Asset.{ Repo, Point } import Ecto.Query require FarmbotCore.Logger diff --git a/farmbot_core/lib/farmbot_celery_script/step_runner.ex b/farmbot_core/lib/celery/step_runner.ex similarity index 94% rename from farmbot_core/lib/farmbot_celery_script/step_runner.ex rename to farmbot_core/lib/celery/step_runner.ex index 20e99b214..e75fd4045 100644 --- a/farmbot_core/lib/farmbot_celery_script/step_runner.ex +++ b/farmbot_core/lib/celery/step_runner.ex @@ -1,9 +1,9 @@ -defmodule FarmbotCeleryScript.StepRunner do +defmodule FarmbotCore.Celery.StepRunner do @moduledoc """ Handles execution of compiled CeleryScript AST """ - alias FarmbotCeleryScript.{AST, Compiler} - alias FarmbotCeleryScript.Compiler.Scope + alias FarmbotCore.Celery.{AST, Compiler} + alias FarmbotCore.Celery.Compiler.Scope require Logger @doc """ diff --git a/farmbot_core/lib/farmbot_celery_script/sys_calls.ex b/farmbot_core/lib/celery/sys_calls.ex similarity index 98% rename from farmbot_core/lib/farmbot_celery_script/sys_calls.ex rename to farmbot_core/lib/celery/sys_calls.ex index 9610afeda..c5f0a3aee 100644 --- a/farmbot_core/lib/farmbot_celery_script/sys_calls.ex +++ b/farmbot_core/lib/celery/sys_calls.ex @@ -1,13 +1,13 @@ -defmodule FarmbotCeleryScript.SysCalls do +defmodule FarmbotCore.Celery.SysCalls do @moduledoc """ Behaviour for abstracting CeleryScript functionality. """ - alias FarmbotCeleryScript.{AST, RuntimeError} + alias FarmbotCore.Celery.{AST, RuntimeError} @sys_calls Application.get_env(:farmbot_core, __MODULE__)[:sys_calls] @sys_calls || Mix.raise(""" - config :farmbot_core, FarmbotCeleryScript.SysCalls, [ + config :farmbot_core, FarmbotCore.Celery.SysCalls, [ sys_calls: SomeModuleThatImplementsTheBehaviour ] """) @@ -45,7 +45,7 @@ defmodule FarmbotCeleryScript.SysCalls do @callback get_cached_y() :: number() | error() @callback get_cached_z() :: number() | error() - @callback get_sequence(resource_id) :: FarmbotCeleryScript.AST.t() | error() + @callback get_sequence(resource_id) :: FarmbotCore.Celery.AST.t() | error() @callback get_toolslot_for_tool(resource_id) :: %{x: number(), y: number(), z: number()} | error() @callback home(axis, speed :: number()) :: ok_or_error diff --git a/farmbot_core/lib/farmbot_celery_script/sys_calls/stubs.ex b/farmbot_core/lib/celery/sys_calls/stubs.ex similarity index 97% rename from farmbot_core/lib/farmbot_celery_script/sys_calls/stubs.ex rename to farmbot_core/lib/celery/sys_calls/stubs.ex index fe41bede8..f338fd09c 100644 --- a/farmbot_core/lib/farmbot_celery_script/sys_calls/stubs.ex +++ b/farmbot_core/lib/celery/sys_calls/stubs.ex @@ -1,8 +1,8 @@ -defmodule FarmbotCeleryScript.SysCalls.Stubs do +defmodule FarmbotCore.Celery.SysCalls.Stubs do @moduledoc """ SysCall implementation that doesn't do anything. Useful for tests. """ - @behaviour FarmbotCeleryScript.SysCalls + @behaviour FarmbotCore.Celery.SysCalls require Logger diff --git a/farmbot_core/lib/farmbot_core.ex b/farmbot_core/lib/farmbot_core.ex index f2f687517..e643e479b 100644 --- a/farmbot_core/lib/farmbot_core.ex +++ b/farmbot_core/lib/farmbot_core.ex @@ -24,7 +24,7 @@ defmodule FarmbotCore do FarmbotCore.BotState.Supervisor, FarmbotCore.StorageSupervisor, FarmbotCore.FirmwareEstopTimer, - FarmbotCeleryScript.Scheduler + FarmbotCore.Celery.Scheduler ] config = (Application.get_env(:farmbot_ext, __MODULE__) || []) Keyword.get(config, :children, default) diff --git a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex index 4668fee1a..1674d0b16 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex @@ -1,6 +1,6 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do alias FarmbotCore.{Asset, Asset.Device} - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST use GenServer require FarmbotCore.Logger @@ -27,7 +27,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do |> AST.Factory.rpc_request("RESET_DEVICE_NOW") |> AST.Factory.factory_reset("farmbot_os") - :ok = FarmbotCeleryScript.execute(ast, make_ref()) + :ok = FarmbotCore.Celery.execute(ast, make_ref()) {:noreply, state} end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex index 251fd61b2..040b0cfe6 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex @@ -1,7 +1,7 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do require Logger require FarmbotCore.Logger - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST alias FarmbotCore.{ Asset, Asset.FarmEvent @@ -30,10 +30,10 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do {:noreply, state} end - def handle_info({FarmbotCeleryScript, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do + def handle_info({FarmbotCore.Celery, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do status = case result do :ok -> "ok" - {:error, reason} -> + {:error, reason} -> FarmbotCore.Logger.error(2, "Event scheduled at #{scheduled_at} failed to execute: #{reason}") reason end @@ -50,12 +50,12 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do sequence || raise("Sequence #{farm_event.executable_id} is not synced") param_appls = AST.decode(farm_event.body) celery_ast = AST.decode(sequence) - celery_args = + celery_args = celery_ast.args |> Map.put(:sequence_name, sequence.name) |> Map.put(:locals, %{celery_ast.args.locals | body: celery_ast.args.locals.body ++ param_appls}) - + celery_ast = %{celery_ast | args: celery_args} - FarmbotCeleryScript.schedule(celery_ast, at, farm_event) + FarmbotCore.Celery.schedule(celery_ast, at, farm_event) end end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex index 8701dda6e..75e15f6a3 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex @@ -3,7 +3,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do require Logger alias FarmbotCore.{Asset.Peripheral, BotState} - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST @retry_ms 1_000 @@ -46,7 +46,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do def handle_info(:timeout, %{peripheral: peripheral, errors: errors} = state) do Logger.debug("Read peripheral: #{peripheral.label}") rpc = peripheral_to_rpc(peripheral) - case FarmbotCeleryScript.execute(rpc, make_ref()) do + case FarmbotCore.Celery.execute(rpc, make_ref()) do :ok -> Logger.debug("Read peripheral: #{peripheral.label} ok") {:noreply, state} diff --git a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex index 519d18607..4bd583cbe 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex @@ -19,7 +19,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do Asset } - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST @error_retry_time_ms 5000 @@ -126,13 +126,13 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do def handle_cast(:trigger, %{pin_binding: %{special_action: "reboot"} = pin_binding} = state) do FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Reboot") - FarmbotCeleryScript.SysCalls.reboot() + FarmbotCore.Celery.SysCalls.reboot() {:noreply, state} end def handle_cast(:trigger, %{pin_binding: %{special_action: "sync"} = pin_binding} = state) do FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Sync") - FarmbotCeleryScript.SysCalls.sync() + FarmbotCore.Celery.SysCalls.sync() {:noreply, state} end @@ -178,7 +178,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do end defp execute(%AST{} = ast, state) do - case FarmbotCeleryScript.execute(ast, make_ref()) do + case FarmbotCore.Celery.execute(ast, make_ref()) do :ok -> :ok diff --git a/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex b/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex index 185cfcdf3..488e2c69f 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex @@ -8,7 +8,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do require Logger require FarmbotCore.Logger - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST alias FarmbotCore.Asset alias FarmbotCore.Asset.{RegimenInstance, FarmEvent, Sequence, Regimen} @@ -57,7 +57,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do {:noreply, state} end - def handle_info({FarmbotCeleryScript, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do + def handle_info({FarmbotCore.Celery, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do status = case result do :ok -> "ok" {:error, reason} -> @@ -89,6 +89,6 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do |> Map.put(:locals, %{celery_ast.args.locals | body: celery_ast.args.locals.body ++ regimen_params ++ farm_event_params}) celery_ast = %{celery_ast | args: celery_args} - FarmbotCeleryScript.schedule(celery_ast, at, sequence) + FarmbotCore.Celery.schedule(celery_ast, at, sequence) end end diff --git a/farmbot_core/lib/farmbot_core/farmware_runtime.ex b/farmbot_core/lib/farmbot_core/farmware_runtime.ex index 292b6acf3..3bf1fe449 100644 --- a/farmbot_core/lib/farmbot_core/farmware_runtime.ex +++ b/farmbot_core/lib/farmbot_core/farmware_runtime.ex @@ -23,7 +23,7 @@ defmodule FarmbotCore.FarmwareRuntime do Handles execution of Farmware plugins. """ - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST alias FarmbotCore.Asset.FarmwareInstallation.Manifest alias FarmbotCore.AssetWorker.FarmbotCore.Asset.FarmwareInstallation alias FarmbotCore.BotState.FileSystem @@ -262,7 +262,7 @@ defmodule FarmbotCore.FarmwareRuntime do ref = make_ref() Logger.debug("executing rpc from farmware: #{inspect(rpc)}") # todo(connor) replace this with StepRunner? - FarmbotCeleryScript.execute(rpc, ref) + FarmbotCore.Celery.execute(rpc, ref) {:noreply, %{state | rpc: rpc, scheduler_ref: ref, context: :process_request}, @error_timeout_ms} diff --git a/farmbot_core/test/asset_workers/device_worker_test.exs b/farmbot_core/test/asset_workers/device_worker_test.exs index a13301224..f0d3827c8 100644 --- a/farmbot_core/test/asset_workers/device_worker_test.exs +++ b/farmbot_core/test/asset_workers/device_worker_test.exs @@ -3,7 +3,7 @@ defmodule FarmbotCore.DeviceWorkerTest do use Mimic alias Farmbot.TestSupport.AssetFixtures - alias FarmbotCeleryScript.SysCalls.Stubs + alias FarmbotCore.Celery.SysCalls.Stubs alias FarmbotCore.Asset.Device alias FarmbotCore.AssetWorker diff --git a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs b/farmbot_core/test/asset_workers/pin_binding_worker_test.exs index c3d1b72dc..15e14ebf9 100644 --- a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs +++ b/farmbot_core/test/asset_workers/pin_binding_worker_test.exs @@ -15,7 +15,7 @@ defmodule FarmbotCore.PinBindingWorkerTest do } } - expect(FarmbotCeleryScript.SysCalls, :reboot, fn -> :ok end) + expect(FarmbotCore.Celery.SysCalls, :reboot, fn -> :ok end) PinBinding.handle_cast(:trigger, params) end @@ -27,7 +27,7 @@ defmodule FarmbotCore.PinBindingWorkerTest do } } - expect(FarmbotCeleryScript.SysCalls, :sync, fn -> :ok end) + expect(FarmbotCore.Celery.SysCalls, :sync, fn -> :ok end) PinBinding.handle_cast(:trigger, params) end end diff --git a/farmbot_core/test/asset_workers/regimen_instance_worker_test.exs b/farmbot_core/test/asset_workers/regimen_instance_worker_test.exs index 5c20e9c91..f9ff59bfd 100644 --- a/farmbot_core/test/asset_workers/regimen_instance_worker_test.exs +++ b/farmbot_core/test/asset_workers/regimen_instance_worker_test.exs @@ -19,7 +19,7 @@ defmodule FarmbotCore.RegimenInstanceAssetWorkerTest do state = %{regimen_instance: regimen_instance} result = GenServer.cast(pid, {:schedule, state}) assert :ok == result - # expect(FarmbotCeleryScript, :schedule, 1, fn _ast, _at, _data -> 1 end) + # expect(FarmbotCore.Celery, :schedule, 1, fn _ast, _at, _data -> 1 end) end end end diff --git a/farmbot_core/test/dot_props_test.exs b/farmbot_core/test/dot_props_test.exs index 0ff67e432..373560405 100644 --- a/farmbot_core/test/dot_props_test.exs +++ b/farmbot_core/test/dot_props_test.exs @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.DotPropsTest do +defmodule FarmbotCore.Celery.DotPropsTest do use ExUnit.Case - doctest FarmbotCeleryScript.DotProps, import: true + doctest FarmbotCore.Celery.DotProps, import: true end diff --git a/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs b/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs index 6191afa36..62a83e4d7 100644 --- a/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs @@ -1,20 +1,20 @@ -defmodule FarmbotCeleryScript.AssertionCompilerTest do +defmodule FarmbotCore.Celery.AssertionCompilerTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.Compiler.{Assertion, Scope} - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.Compiler.{Assertion, Scope} + alias FarmbotCore.Celery.AST test "Assertion.assertion/2" do scope = Scope.new() - expect(FarmbotCeleryScript.SysCalls, :log_assertion, 1, fn ok?, t, msg -> + expect(FarmbotCore.Celery.SysCalls, :log_assertion, 1, fn ok?, t, msg -> refute ok? assert t == "abort" assert msg == "[comment] failed to evaluate, aborting" :ok end) - expect(FarmbotCeleryScript.Compiler.Lua, :do_lua, 1, fn lua, actual_scope -> + expect(FarmbotCore.Celery.Compiler.Lua, :do_lua, 1, fn lua, actual_scope -> assert lua == "return false" assert actual_scope == scope {:error, "intentional failure case"} diff --git a/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs b/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs index 0cf4acf80..53895a1f0 100644 --- a/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs +++ b/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs @@ -1,4 +1,4 @@ -defmodule FarmbotCeleryScript.AST.FactoryTest do +defmodule FarmbotCore.Celery.AST.FactoryTest do use ExUnit.Case - doctest FarmbotCeleryScript.AST.Factory, import: true + doctest FarmbotCore.Celery.AST.Factory, import: true end diff --git a/farmbot_core/test/farmbot_celery_script/ast_test.exs b/farmbot_core/test/farmbot_celery_script/ast_test.exs index 19a5e7df4..ab5b19a75 100644 --- a/farmbot_core/test/farmbot_celery_script/ast_test.exs +++ b/farmbot_core/test/farmbot_celery_script/ast_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.ASTTest do +defmodule FarmbotCore.Celery.ASTTest do use ExUnit.Case - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST @nothing_json "{\"kind\": \"nothing\", \"args\": {}}" |> Jason.decode!() diff --git a/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs b/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs index e94074cbb..300ec3d55 100644 --- a/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs +++ b/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs @@ -1,8 +1,8 @@ -defmodule FarmbotCeleryScript.CompilerGroupsTest do +defmodule FarmbotCore.Celery.CompilerGroupsTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.Compiler.{Utils, Scope} + alias FarmbotCore.Celery.Compiler.{Utils, Scope} setup :verify_on_exit! @@ -22,12 +22,12 @@ defmodule FarmbotCeleryScript.CompilerGroupsTest do fun end) - expect(FarmbotCeleryScript.SysCalls, :sequence_init_log, 1, fn log -> + expect(FarmbotCore.Celery.SysCalls, :sequence_init_log, 1, fn log -> assert log == "[4/8] Starting test sequence" :ok end) - expect(FarmbotCeleryScript.SysCalls, :sequence_complete_log, 1, fn log -> + expect(FarmbotCore.Celery.SysCalls, :sequence_complete_log, 1, fn log -> assert log == "Completed test sequence" :ok end) diff --git a/farmbot_core/test/farmbot_celery_script/compiler_test.exs b/farmbot_core/test/farmbot_celery_script/compiler_test.exs index 5a2cc9fd8..afe13b754 100644 --- a/farmbot_core/test/farmbot_celery_script/compiler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/compiler_test.exs @@ -1,11 +1,11 @@ -defmodule FarmbotCeleryScript.CompilerTest do +defmodule FarmbotCore.Celery.CompilerTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.{AST, Compiler} - alias FarmbotCeleryScript.Compiler.Scope + alias FarmbotCore.Celery.{AST, Compiler} + alias FarmbotCore.Celery.Compiler.Scope # Only required to compile - alias FarmbotCeleryScript.SysCalls, warn: false + alias FarmbotCore.Celery.SysCalls, warn: false test "change_ownership" do email = "t@g.com" @@ -18,9 +18,9 @@ defmodule FarmbotCeleryScript.CompilerTest do %{args: %{label: "server", value: server}} ] - expect(FarmbotCeleryScript.SysCalls, :change_ownership, 1, fn eml, - scrt, - srvr -> + expect(FarmbotCore.Celery.SysCalls, :change_ownership, 1, fn eml, + scrt, + srvr -> assert eml == email assert scrt == "\xB2\xEA^\xAD۩z" assert srvr == server @@ -28,7 +28,7 @@ defmodule FarmbotCeleryScript.CompilerTest do end) result = - FarmbotCeleryScript.Compiler.change_ownership(%{body: body}, Scope.new()) + FarmbotCore.Celery.Compiler.change_ownership(%{body: body}, Scope.new()) |> Code.eval_quoted() assert result == {:ok, []} @@ -40,7 +40,7 @@ defmodule FarmbotCeleryScript.CompilerTest do msg = "Hello, world!" args = %{args: %{message: msg, message_type: type}, body: channels} - expect(FarmbotCeleryScript.SysCalls, :send_message, 1, fn t, m, c -> + expect(FarmbotCore.Celery.SysCalls, :send_message, 1, fn t, m, c -> assert t == type assert m == msg assert c == [:email] @@ -48,7 +48,7 @@ defmodule FarmbotCeleryScript.CompilerTest do end) result = - FarmbotCeleryScript.Compiler.send_message(args, Scope.new()) + FarmbotCore.Celery.Compiler.send_message(args, Scope.new()) |> Code.eval_quoted() assert result == {:ok, []} @@ -116,8 +116,8 @@ defmodule FarmbotCeleryScript.CompilerTest do strip_nl(""" package = "take-photo" env = %{"a" => "123"} - FarmbotCeleryScript.SysCalls.log(\"Taking photo\", true) - FarmbotCeleryScript.SysCalls.execute_script(package, env) + FarmbotCore.Celery.SysCalls.log(\"Taking photo\", true) + FarmbotCore.Celery.SysCalls.execute_script(package, env) """) end @@ -134,8 +134,8 @@ defmodule FarmbotCeleryScript.CompilerTest do assert compiled == strip_nl(""" - FarmbotCeleryScript.SysCalls.set_user_env("a", "123") - FarmbotCeleryScript.SysCalls.set_user_env("b", "345") + FarmbotCore.Celery.SysCalls.set_user_env("a", "123") + FarmbotCore.Celery.SysCalls.set_user_env("b", "345") """) end @@ -149,8 +149,8 @@ defmodule FarmbotCeleryScript.CompilerTest do assert compiled == strip_nl(""" - FarmbotCeleryScript.SysCalls.log("Installing dependencies...") - FarmbotCeleryScript.SysCalls.install_first_party_farmware() + FarmbotCore.Celery.SysCalls.log("Installing dependencies...") + FarmbotCore.Celery.SysCalls.install_first_party_farmware() """) end @@ -164,7 +164,7 @@ defmodule FarmbotCeleryScript.CompilerTest do assert compiled == strip_nl(""" - FarmbotCeleryScript.SysCalls.nothing() + FarmbotCore.Celery.SysCalls.nothing() """) end @@ -225,7 +225,7 @@ defmodule FarmbotCeleryScript.CompilerTest do }) expected = - "[x, y, z] = [100 + -20, 100 + -20, 100 + -20] x_str = FarmbotCeleryScript.FormatUtil.format_float(x) y_str = FarmbotCeleryScript.FormatUtil.format_float(y) z_str = FarmbotCeleryScript.FormatUtil.format_float(z) FarmbotCeleryScript.SysCalls.log(\"Moving to (\#{x_str}, \#{y_str}, \#{z_str})\", true) FarmbotCeleryScript.SysCalls.move_absolute(x, y, z, 100)" + "[x, y, z] = [100 + -20, 100 + -20, 100 + -20] x_str = FarmbotCore.Celery.FormatUtil.format_float(x) y_str = FarmbotCore.Celery.FormatUtil.format_float(y) z_str = FarmbotCore.Celery.FormatUtil.format_float(z) FarmbotCore.Celery.SysCalls.log(\"Moving to (\#{x_str}, \#{y_str}, \#{z_str})\", true) FarmbotCore.Celery.SysCalls.move_absolute(x, y, z, 100)" assert compiled == expected end @@ -248,18 +248,18 @@ defmodule FarmbotCeleryScript.CompilerTest do locx when is_number(locx) <- 100.4, locy when is_number(locy) <- 90, locz when is_number(locz) <- 50, - curx when is_number(curx) <- FarmbotCeleryScript.SysCalls.get_current_x(), - cury when is_number(cury) <- FarmbotCeleryScript.SysCalls.get_current_y(), - curz when is_number(curz) <- FarmbotCeleryScript.SysCalls.get_current_z() + curx when is_number(curx) <- FarmbotCore.Celery.SysCalls.get_current_x(), + cury when is_number(cury) <- FarmbotCore.Celery.SysCalls.get_current_y(), + curz when is_number(curz) <- FarmbotCore.Celery.SysCalls.get_current_z() ) do x = locx + curx y = locy + cury z = locz + curz - x_str = FarmbotCeleryScript.FormatUtil.format_float(x) - y_str = FarmbotCeleryScript.FormatUtil.format_float(y) - z_str = FarmbotCeleryScript.FormatUtil.format_float(z) - FarmbotCeleryScript.SysCalls.log("Moving relative to (\#{x_str}, \#{y_str}, \#{z_str})", true) - FarmbotCeleryScript.SysCalls.move_absolute(x, y, z, 100) + x_str = FarmbotCore.Celery.FormatUtil.format_float(x) + y_str = FarmbotCore.Celery.FormatUtil.format_float(y) + z_str = FarmbotCore.Celery.FormatUtil.format_float(z) + FarmbotCore.Celery.SysCalls.log("Moving relative to (\#{x_str}, \#{y_str}, \#{z_str})", true) + FarmbotCore.Celery.SysCalls.move_absolute(x, y, z, 100) end """) end @@ -273,8 +273,8 @@ defmodule FarmbotCeleryScript.CompilerTest do # expected = # "pin = 17\nmode = 0\nvalue = 1\n\nwith(:ok <- " <> - # "FarmbotCeleryScript.SysCalls.write_pin(pin, mode, value))" <> - # " do\n me = FarmbotCeleryScript.Compiler.PinControl\n" <> + # "FarmbotCore.Celery.SysCalls.write_pin(pin, mode, value))" <> + # " do\n me = FarmbotCore.Celery.Compiler.PinControl\n" <> # " me.conclude(pin, mode, value)\nend" # assert compiled == expected @@ -291,7 +291,7 @@ defmodule FarmbotCeleryScript.CompilerTest do strip_nl(""" pin = 23 mode = 0 - FarmbotCeleryScript.SysCalls.read_pin(pin, mode) + FarmbotCore.Celery.SysCalls.read_pin(pin, mode) """) end @@ -306,8 +306,8 @@ defmodule FarmbotCeleryScript.CompilerTest do strip_nl(""" pin = 23 angle = 90 - FarmbotCeleryScript.SysCalls.log("Writing servo: \#{pin}: \#{angle}") - FarmbotCeleryScript.SysCalls.set_servo_angle(pin, angle) + FarmbotCore.Celery.SysCalls.log("Writing servo: \#{pin}: \#{angle}") + FarmbotCore.Celery.SysCalls.set_servo_angle(pin, angle) """) end @@ -322,8 +322,8 @@ defmodule FarmbotCeleryScript.CompilerTest do strip_nl(""" pin = 23 mode = "input" - FarmbotCeleryScript.SysCalls.log("Setting pin mode: \#{pin}: \#{mode}") - FarmbotCeleryScript.SysCalls.set_pin_io_mode(pin, mode) + FarmbotCore.Celery.SysCalls.log("Setting pin mode: \#{pin}: \#{mode}") + FarmbotCore.Celery.SysCalls.set_pin_io_mode(pin, mode) """) end @@ -334,12 +334,12 @@ defmodule FarmbotCeleryScript.CompilerTest do end test "lua in RPC, no variable declarations" do - example = %FarmbotCeleryScript.AST{ + example = %FarmbotCore.Celery.AST{ args: %{ label: "abcdefgh" }, body: [ - %FarmbotCeleryScript.AST{ + %FarmbotCore.Celery.AST{ args: %{ lua: """ usage = read_status('informational_settings').scheduler_usage diff --git a/farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs b/farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs index ca7af3e38..2b1fda865 100644 --- a/farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs +++ b/farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs @@ -1,18 +1,18 @@ -defmodule FarmbotCeleryScript.Compiler.PinControlTest do +defmodule FarmbotCore.Celery.Compiler.PinControlTest do use ExUnit.Case use Mimic setup :verify_on_exit! - alias FarmbotCeleryScript.Compiler.PinControl + alias FarmbotCore.Celery.Compiler.PinControl test "conclude/3" do - expect(FarmbotCeleryScript.SysCalls, :read_pin, fn pin, mode -> + expect(FarmbotCore.Celery.SysCalls, :read_pin, fn pin, mode -> assert pin == 1 assert mode == 0 :ok end) - expect(FarmbotCeleryScript.SysCalls, :log, fn msg -> + expect(FarmbotCore.Celery.SysCalls, :log, fn msg -> expected = "Pin 3 is 4 (analog)" assert msg == expected :ok diff --git a/farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs b/farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs index f15ff82e3..4a3938bcb 100644 --- a/farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs +++ b/farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.Corpus.ArgTest do +defmodule FarmbotCore.Celery.Corpus.ArgTest do use ExUnit.Case - alias FarmbotCeleryScript.Corpus + alias FarmbotCore.Celery.Corpus test "inspect" do assert "#Arg<_then [execute, nothing]>" = inspect(Corpus.arg("_then")) diff --git a/farmbot_core/test/farmbot_celery_script/corpus/node_test.exs b/farmbot_core/test/farmbot_celery_script/corpus/node_test.exs index ca90cc881..447cf60c4 100644 --- a/farmbot_core/test/farmbot_celery_script/corpus/node_test.exs +++ b/farmbot_core/test/farmbot_celery_script/corpus/node_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.Corpus.NodeTest do +defmodule FarmbotCore.Celery.Corpus.NodeTest do use ExUnit.Case - alias FarmbotCeleryScript.Corpus + alias FarmbotCore.Celery.Corpus test "inspect" do a = diff --git a/farmbot_core/test/farmbot_celery_script/corpus_test.exs b/farmbot_core/test/farmbot_celery_script/corpus_test.exs index 18dd116b5..5fa83f7a6 100644 --- a/farmbot_core/test/farmbot_celery_script/corpus_test.exs +++ b/farmbot_core/test/farmbot_celery_script/corpus_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.CorpusTest do +defmodule FarmbotCore.Celery.CorpusTest do use ExUnit.Case - alias FarmbotCeleryScript.Corpus + alias FarmbotCore.Celery.Corpus test "lists all node names" do assert "sequence" in Corpus.all_node_names() diff --git a/farmbot_core/test/farmbot_celery_script/integration_test.exs b/farmbot_core/test/farmbot_celery_script/integration_test.exs index 1a3a6aa45..cd884800a 100644 --- a/farmbot_core/test/farmbot_celery_script/integration_test.exs +++ b/farmbot_core/test/farmbot_celery_script/integration_test.exs @@ -1,11 +1,11 @@ # This is a "kitchen sink" of sorts. -defmodule FarmbotCeleryScript.IntegrationTest do +defmodule FarmbotCore.Celery.IntegrationTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.Compiler - alias FarmbotCeleryScript.AST - alias FarmbotCeleryScript.Compiler.Scope + alias FarmbotCore.Celery.Compiler + alias FarmbotCore.Celery.AST + alias FarmbotCore.Celery.Compiler.Scope setup :verify_on_exit! @@ -24,11 +24,11 @@ defmodule FarmbotCeleryScript.IntegrationTest do ] test "all the fixtures (should not crash!)" do - expect(FarmbotCeleryScript.SysCalls, :get_sequence, 7, fn _id -> + expect(FarmbotCore.Celery.SysCalls, :get_sequence, 7, fn _id -> compile_celery_file("fixture/inner_sequence.json") end) - expect(FarmbotCeleryScript.SysCalls, :point, 12, fn _type, _id -> + expect(FarmbotCore.Celery.SysCalls, :point, 12, fn _type, _id -> %{x: 99, y: 88, z: 77} end) diff --git a/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs b/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs index 0faea031b..dac25e521 100644 --- a/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs @@ -1,7 +1,7 @@ -defmodule FarmbotCeleryScript.LuaTest do +defmodule FarmbotCore.Celery.LuaTest do use ExUnit.Case - alias FarmbotCeleryScript.Compiler.Lua - alias FarmbotCeleryScript.Compiler.Scope + alias FarmbotCore.Celery.Compiler.Lua + alias FarmbotCore.Celery.Compiler.Scope test "conversion of `cs_scope` to luerl params" do cs_scope = %Scope{ diff --git a/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs b/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs index bc358e67f..e2a11f21c 100644 --- a/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs @@ -1,14 +1,14 @@ -defmodule FarmbotCeleryScript.MoveCompilerTest do +defmodule FarmbotCore.Celery.MoveCompilerTest do use ExUnit.Case, async: false use Mimic - alias FarmbotCeleryScript.{ + alias FarmbotCore.Celery.{ Compiler, Compiler.Move, SysCalls.Stubs } - alias FarmbotCeleryScript.SysCalls, warn: false + alias FarmbotCore.Celery.SysCalls, warn: false setup :verify_on_exit! @@ -261,7 +261,7 @@ defmodule FarmbotCeleryScript.MoveCompilerTest do fake_variance = %{kind: :random, args: %{variance: 10}} - expect(FarmbotCeleryScript.SpecialValue, :safe_height, fn -> 1.23 end) + expect(FarmbotCore.Celery.SpecialValue, :safe_height, fn -> 1.23 end) assert Move.to_number(:z, @soil_height) == {:skip, :soil_height} assert Move.to_number(:z, @safe_height) == 1.23 @@ -405,7 +405,7 @@ defmodule FarmbotCeleryScript.MoveCompilerTest do {:safe_z, :=, true} ] - expect(FarmbotCeleryScript.SpecialValue, :soil_height, 1, fn coord -> + expect(FarmbotCore.Celery.SpecialValue, :soil_height, 1, fn coord -> assert coord.x == 0.0 assert coord.y == 5.0 diff --git a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs b/farmbot_core/test/farmbot_celery_script/scheduler_test.exs index 48765674c..bac416b05 100644 --- a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/scheduler_test.exs @@ -1,8 +1,8 @@ -defmodule FarmbotCeleryScript.SchedulerTest do +defmodule FarmbotCore.Celery.SchedulerTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.{Scheduler, AST} - alias FarmbotCeleryScript.SysCalls.Stubs + alias FarmbotCore.Celery.{Scheduler, AST} + alias FarmbotCore.Celery.SysCalls.Stubs import ExUnit.CaptureLog setup :set_mimic_global diff --git a/farmbot_core/test/farmbot_celery_script/scope_test.exs b/farmbot_core/test/farmbot_celery_script/scope_test.exs index 1b41d9463..e032783b6 100644 --- a/farmbot_core/test/farmbot_celery_script/scope_test.exs +++ b/farmbot_core/test/farmbot_celery_script/scope_test.exs @@ -1,7 +1,7 @@ -defmodule FarmbotCeleryScript.Compiler.ScopeTest do +defmodule FarmbotCore.Celery.Compiler.ScopeTest do use ExUnit.Case - alias FarmbotCeleryScript.AST - alias FarmbotCeleryScript.Compiler.Scope + alias FarmbotCore.Celery.AST + alias FarmbotCore.Celery.Compiler.Scope @fixture "test/fixtures/execute.json" |> File.read!() diff --git a/farmbot_core/test/farmbot_celery_script/special_value_test.exs b/farmbot_core/test/farmbot_celery_script/special_value_test.exs index adb6fa0c1..1fae5f73a 100644 --- a/farmbot_core/test/farmbot_celery_script/special_value_test.exs +++ b/farmbot_core/test/farmbot_celery_script/special_value_test.exs @@ -1,8 +1,8 @@ -defmodule FarmbotCeleryScript.SpecialValueTest do +defmodule FarmbotCore.Celery.SpecialValueTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.SpecialValue + alias FarmbotCore.Celery.SpecialValue import ExUnit.CaptureLog setup :verify_on_exit! diff --git a/farmbot_core/test/farmbot_celery_script/sys_calls_test.exs b/farmbot_core/test/farmbot_celery_script/sys_calls_test.exs index 0f83c55f8..cef5c1420 100644 --- a/farmbot_core/test/farmbot_celery_script/sys_calls_test.exs +++ b/farmbot_core/test/farmbot_celery_script/sys_calls_test.exs @@ -1,8 +1,8 @@ -defmodule FarmbotCeleryScript.SysCallsTest do +defmodule FarmbotCore.Celery.SysCallsTest do use ExUnit.Case, async: false use Mimic - alias FarmbotCeleryScript.{ + alias FarmbotCore.Celery.{ SysCalls, SysCalls.Stubs, AST @@ -25,7 +25,7 @@ defmodule FarmbotCeleryScript.SysCallsTest do end) boom = fn -> SysCalls.point(Stubs, "Peripheral", 0) end - assert_raise FarmbotCeleryScript.RuntimeError, boom + assert_raise FarmbotCore.Celery.RuntimeError, boom end test "point groups failure" do @@ -34,7 +34,7 @@ defmodule FarmbotCeleryScript.SysCallsTest do end) boom = fn -> SysCalls.find_points_via_group(Stubs, :something_else) end - assert_raise FarmbotCeleryScript.RuntimeError, boom + assert_raise FarmbotCore.Celery.RuntimeError, boom end test "point groups success" do diff --git a/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs b/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs index abb9b6e62..e37b3202e 100644 --- a/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs +++ b/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs @@ -1,9 +1,9 @@ -defmodule FarmbotCeleryScript.VariableTransformerTest do +defmodule FarmbotCore.Celery.VariableTransformerTest do use ExUnit.Case, async: false use Mimic - alias FarmbotCeleryScript.Compiler.VariableTransformer - alias FarmbotCeleryScript.SysCalls.Stubs + alias FarmbotCore.Celery.Compiler.VariableTransformer + alias FarmbotCore.Celery.SysCalls.Stubs setup :verify_on_exit! diff --git a/farmbot_core/test/farmbot_celery_script_test.exs b/farmbot_core/test/farmbot_celery_script_test.exs index 583e661db..615c95bda 100644 --- a/farmbot_core/test/farmbot_celery_script_test.exs +++ b/farmbot_core/test/farmbot_celery_script_test.exs @@ -1,9 +1,9 @@ -defmodule FarmbotCeleryScriptTest do +defmodule FarmbotCore.CeleryTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.AST - alias FarmbotCeleryScript.SysCalls.Stubs + alias FarmbotCore.Celery.AST + alias FarmbotCore.Celery.SysCalls.Stubs import ExUnit.CaptureLog @@ -14,16 +14,16 @@ defmodule FarmbotCeleryScriptTest do ast = AST.decode(%{kind: :rpc_request, args: %{label: "X"}, body: []}) data = %{foo: :bar} - expect(FarmbotCeleryScript.Scheduler, :schedule, 1, fn actual_ast, - actual_at, - actual_data -> + expect(FarmbotCore.Celery.Scheduler, :schedule, 1, fn actual_ast, + actual_at, + actual_data -> assert actual_ast == ast assert actual_at == at assert actual_data == data :ok end) - assert :ok == FarmbotCeleryScript.schedule(ast, at, data) + assert :ok == FarmbotCore.Celery.schedule(ast, at, data) end test "uses default values when no parameter is found" do @@ -75,7 +75,7 @@ defmodule FarmbotCeleryScriptTest do end) capture_log(fn -> - result = FarmbotCeleryScript.execute(sequence_ast, me) + result = FarmbotCore.Celery.execute(sequence_ast, me) assert :ok == result end) =~ "[error] CeleryScript syscall stubbed: log" end @@ -92,7 +92,7 @@ defmodule FarmbotCeleryScriptTest do |> AST.decode() expect(Stubs, :read_pin, 1, fn _, _ -> {:error, "failed to read pin!"} end) - result = FarmbotCeleryScript.execute(execute_ast, execute_ast) + result = FarmbotCore.Celery.execute(execute_ast, execute_ast) assert {:error, "failed to read pin!"} = result assert_receive {:csvm_done, ^execute_ast, {:error, "failed to read pin!"}} @@ -116,7 +116,7 @@ defmodule FarmbotCeleryScriptTest do io = capture_log(fn -> assert {:error, "big oops"} == - FarmbotCeleryScript.execute(execute_ast, execute_ast) + FarmbotCore.Celery.execute(execute_ast, execute_ast) end) assert io =~ "CeleryScript Exception" diff --git a/farmbot_core/test/interpolation_test.exs b/farmbot_core/test/interpolation_test.exs index c63df4005..3958a1fb1 100644 --- a/farmbot_core/test/interpolation_test.exs +++ b/farmbot_core/test/interpolation_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.InterpolationTest do +defmodule FarmbotCore.Celery.InterpolationTest do use ExUnit.Case - alias FarmbotCeleryScript.Interpolation + alias FarmbotCore.Celery.Interpolation test "guess_z_value/2 - base case" do soil_points = [ diff --git a/farmbot_core/test/stub_test.exs b/farmbot_core/test/stub_test.exs index d757ae432..f05f9c121 100644 --- a/farmbot_core/test/stub_test.exs +++ b/farmbot_core/test/stub_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.SysCalls.StubsTest do +defmodule FarmbotCore.Celery.SysCalls.StubsTest do use ExUnit.Case - alias FarmbotCeleryScript.SysCalls.Stubs + alias FarmbotCore.Celery.SysCalls.Stubs test "various stubs" do # This test is to: diff --git a/farmbot_core/test/test_helper.exs b/farmbot_core/test/test_helper.exs index 3cf6bafb8..f414893cb 100644 --- a/farmbot_core/test/test_helper.exs +++ b/farmbot_core/test/test_helper.exs @@ -6,12 +6,12 @@ FarmbotCore.Asset.Device.changeset(FarmbotCore.Asset.device(), %{timezone: tz}) [ Circuits.UART, - FarmbotCeleryScript, - FarmbotCeleryScript.Compiler.Lua, - FarmbotCeleryScript.Scheduler, - FarmbotCeleryScript.SpecialValue, - FarmbotCeleryScript.SysCalls, - FarmbotCeleryScript.SysCalls.Stubs, + FarmbotCore.Celery, + FarmbotCore.Celery.Compiler.Lua, + FarmbotCore.Celery.Scheduler, + FarmbotCore.Celery.SpecialValue, + FarmbotCore.Celery.SysCalls, + FarmbotCore.Celery.SysCalls.Stubs, FarmbotCore.Asset, FarmbotCore.Asset.Private, FarmbotCore.Asset.Repo, diff --git a/farmbot_ext/config/config.exs b/farmbot_ext/config/config.exs index 4501b7d51..e6233fc89 100644 --- a/farmbot_ext/config/config.exs +++ b/farmbot_ext/config/config.exs @@ -4,7 +4,7 @@ config :tesla, adapter: Tesla.Adapter.Hackney config :logger, handle_otp_reports: true, handle_sasl_reports: true # TODO(Rick) We probably don't need to use this anymore now that Mox is a thing. -config :farmbot_core, FarmbotCeleryScript.SysCalls, sys_calls: FarmbotCeleryScript.SysCalls.Stubs +config :farmbot_core, FarmbotCore.Celery.SysCalls, sys_calls: FarmbotCore.Celery.SysCalls.Stubs repos = [FarmbotCore.Config.Repo, FarmbotCore.Logger.Repo, FarmbotCore.Asset.Repo] config :farmbot_core, ecto_repos: repos @@ -66,8 +66,8 @@ if is_test? do FarmbotExt, FarmbotExt.MQTT.Supervisor, FarmbotExt.MQTT.ChannelSupervisor, - FarmbotExt.API.DirtyWorker.Supervisor, - FarmbotExt.API.EagerLoader.Supervisor, + FarmbotExt.DirtyWorker.Supervisor, + FarmbotExt.EagerLoader.Supervisor, FarmbotExt.Bootstrap.Supervisor ] diff --git a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex index fdabf7968..f8e5cbaf6 100644 --- a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex +++ b/farmbot_ext/lib/farmbot_ext/api/reconciler.ex @@ -10,8 +10,8 @@ defmodule FarmbotExt.API.Reconciler do alias Ecto.Changeset import Ecto.Query - alias FarmbotExt.API - alias API.{SyncGroup, EagerLoader} + alias FarmbotExt.{API, EagerLoader} + alias API.SyncGroup alias FarmbotCore.Asset.{Command, Repo, Sync, Sync.Item} import FarmbotCore.TimeUtils, only: [compare_datetimes: 2] diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap.ex b/farmbot_ext/lib/farmbot_ext/bootstrap.ex index d10e8dda8..b0cd4a403 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap.ex +++ b/farmbot_ext/lib/farmbot_ext/bootstrap.ex @@ -63,7 +63,7 @@ defmodule FarmbotExt.Bootstrap do msg = "Password auth failed! Check again and reconfigurate." Logger.error(msg) FarmbotCore.Logger.debug(3, msg) - FarmbotCeleryScript.SysCalls.factory_reset("farmbot_os") + FarmbotCore.Celery.SysCalls.factory_reset("farmbot_os") FarmbotExt.Time.no_reply(nil, 5000) er -> diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex b/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex index 0ac70331c..126bf3bc3 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex @@ -19,8 +19,8 @@ defmodule FarmbotExt.Bootstrap.Supervisor do config = Application.get_env(:farmbot_ext, __MODULE__) || [] Keyword.get(config, :children, [ - FarmbotExt.API.EagerLoader.Supervisor, - FarmbotExt.API.DirtyWorker.Supervisor, + FarmbotExt.EagerLoader.Supervisor, + FarmbotExt.DirtyWorker.Supervisor, FarmbotExt.MQTT.Supervisor, FarmbotExt.API.ImageUploader, FarmbotExt.Bootstrap.DropPasswordTask, diff --git a/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex b/farmbot_ext/lib/farmbot_ext/dirty_worker.ex similarity index 98% rename from farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex rename to farmbot_ext/lib/farmbot_ext/dirty_worker.ex index cca248a91..efafddd99 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex +++ b/farmbot_ext/lib/farmbot_ext/dirty_worker.ex @@ -1,10 +1,10 @@ -defmodule FarmbotExt.API.DirtyWorker do +defmodule FarmbotExt.DirtyWorker do @moduledoc "Handles uploading/downloading of data from the APIFetcher." alias FarmbotCore.Asset.{Private, Repo} alias FarmbotExt.{ API, - API.DirtyWorker, + DirtyWorker, APIFetcher } @@ -120,7 +120,7 @@ defmodule FarmbotExt.API.DirtyWorker do def do_stale_recovery(timeout) do FarmbotCore.Logger.error(4, @stale_warning) Private.recover_from_row_lock_failure() - FarmbotCeleryScript.SysCalls.sync() + FarmbotCore.Celery.SysCalls.sync() FarmbotExt.Time.sleep(timeout * 10) true end diff --git a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex b/farmbot_ext/lib/farmbot_ext/dirty_worker/supervisor.ex similarity index 93% rename from farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex rename to farmbot_ext/lib/farmbot_ext/dirty_worker/supervisor.ex index d129f45b8..0b7397b13 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/dirty_worker/supervisor.ex @@ -1,11 +1,11 @@ -defmodule FarmbotExt.API.DirtyWorker.Supervisor do +defmodule FarmbotExt.DirtyWorker.Supervisor do @moduledoc """ Responsible for supervising assets that will need to be uploaded to the API via a `POST` or `PUT` request. """ use Supervisor - alias FarmbotExt.API.DirtyWorker + alias FarmbotExt.DirtyWorker alias FarmbotCore.Asset.{ Device, diff --git a/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex b/farmbot_ext/lib/farmbot_ext/eager_loader.ex similarity index 97% rename from farmbot_ext/lib/farmbot_ext/api/eager_loader.ex rename to farmbot_ext/lib/farmbot_ext/eager_loader.ex index b8950d831..08042810e 100644 --- a/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex +++ b/farmbot_ext/lib/farmbot_ext/eager_loader.ex @@ -1,9 +1,10 @@ -defmodule FarmbotExt.API.EagerLoader do +defmodule FarmbotExt.EagerLoader do @moduledoc "Handles caching of asset changes" alias FarmbotCore.Asset.{Repo, Sync} alias FarmbotExt.API - alias FarmbotExt.API.{SyncGroup, EagerLoader} + alias FarmbotExt.API.SyncGroup + alias FarmbotExt.EagerLoader alias Ecto.Changeset import Ecto.Query require Logger diff --git a/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex b/farmbot_ext/lib/farmbot_ext/eager_loader/supervisor.ex similarity index 88% rename from farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex rename to farmbot_ext/lib/farmbot_ext/eager_loader/supervisor.ex index 086b77fa4..6211d3e13 100644 --- a/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex +++ b/farmbot_ext/lib/farmbot_ext/eager_loader/supervisor.ex @@ -1,11 +1,11 @@ -defmodule FarmbotExt.API.EagerLoader.Supervisor do +defmodule FarmbotExt.EagerLoader.Supervisor do @moduledoc """ Responsible for supervising all assets that need to be eagerloaded """ use Supervisor - alias FarmbotExt.API.EagerLoader + alias FarmbotExt.EagerLoader alias FarmbotCore.Asset.{ Device, @@ -33,7 +33,7 @@ defmodule FarmbotExt.API.EagerLoader.Supervisor do @doc "Drop all cached assets" def drop_all_cache() do - for {_, pid, _, _} <- Supervisor.which_children(FarmbotExt.API.EagerLoader.Supervisor), + for {_, pid, _, _} <- Supervisor.which_children(FarmbotExt.EagerLoader.Supervisor), do: GenServer.cast(pid, :drop) end diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex b/farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex index f5995e233..aa3b5f81b 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex +++ b/farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex @@ -5,7 +5,7 @@ defmodule FarmbotExt.MQTT.RPCHandler do require FarmbotTelemetry require Logger - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST alias FarmbotCore.JSON alias FarmbotExt.MQTT alias FarmbotExt.Time @@ -32,7 +32,7 @@ defmodule FarmbotExt.MQTT.RPCHandler do ast = JSON.decode!(payload) |> AST.decode() channel_pid = self() ref = make_ref() - _pid = spawn(fn -> FarmbotCeleryScript.execute(ast, ref, channel_pid) end) + _pid = spawn(fn -> FarmbotCore.Celery.execute(ast, ref, channel_pid) end) timeout = ast.args[:timeout] || 0 has_timer? = timeout > 0 timer = if has_timer?, do: Time.send_after(self(), @timeoutmsg, timeout) diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex b/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex index a462a95e7..b0f7e1abd 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex +++ b/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex @@ -3,9 +3,9 @@ defmodule FarmbotExt.MQTT.SyncHandlerSupport do require FarmbotTelemetry require Logger - alias FarmbotCore.{BotState, JSON, Leds, Asset} - alias FarmbotExt.API.{EagerLoader, Preloader} - alias FarmbotExt.MQTT + alias FarmbotCore.{Asset, BotState, JSON, Leds} + alias FarmbotExt.API.Preloader + alias FarmbotExt.{MQTT, EagerLoader} defstruct client_id: "NOT_SET", username: "NOT_SET", preloaded: false diff --git a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs b/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs index 5706fe29f..0d5f45947 100644 --- a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs +++ b/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs @@ -1,4 +1,4 @@ -defmodule FarmbotExt.API.DirtyWorkerTest do +defmodule FarmbotExt.DirtyWorkerTest do require Helpers use ExUnit.Case @@ -12,9 +12,9 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Repo } - alias FarmbotExt.API.DirtyWorker.Supervisor + alias FarmbotExt.DirtyWorker.Supervisor - alias FarmbotExt.API.DirtyWorker + alias FarmbotExt.DirtyWorker setup :verify_on_exit! @@ -38,7 +38,7 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Private.mark_stale!(p) assert Private.any_stale?() - expect(FarmbotCeleryScript.SysCalls, :sync, 1, fn -> + expect(FarmbotCore.Celery.SysCalls, :sync, 1, fn -> Private.mark_clean!(p) end) @@ -55,7 +55,7 @@ defmodule FarmbotExt.API.DirtyWorkerTest do |> FbosConfig.changeset() |> Repo.insert!() - expect(FarmbotCeleryScript.SysCalls, :sync, 1, fn -> + expect(FarmbotCore.Celery.SysCalls, :sync, 1, fn -> "I expect a 409 response to trigger a sync." end) @@ -70,7 +70,7 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Helpers.delete_all_points() Repo.delete_all(LocalMeta) - stub(FarmbotCeleryScript.SysCalls, :sync, fn -> + stub(FarmbotCore.Celery.SysCalls, :sync, fn -> flunk("Never should call sync") end) diff --git a/farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs b/farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs index 077751c27..fe94c1441 100644 --- a/farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs +++ b/farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs @@ -1,7 +1,7 @@ -defmodule FarmbotExt.API.EagerLoader.SupervisorTest do +defmodule FarmbotExt.EagerLoader.SupervisorTest do use ExUnit.Case - alias FarmbotExt.API.EagerLoader.Supervisor + alias FarmbotExt.EagerLoader.Supervisor test "children" do results = Supervisor.children() diff --git a/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs b/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs index 109341820..9dc6d78e6 100644 --- a/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs +++ b/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs @@ -1,9 +1,9 @@ -defmodule FarmbotExt.API.EagerLoaderTest do +defmodule FarmbotExt.EagerLoaderTest do use ExUnit.Case use Mimic setup :verify_on_exit! - alias FarmbotExt.API.EagerLoader + alias FarmbotExt.EagerLoader alias FarmbotCore.Asset.Sync alias FarmbotExt.API.SyncGroup @@ -13,14 +13,14 @@ defmodule FarmbotExt.API.EagerLoaderTest do end test "child_spec/1" do - opts = [[module: FarmbotExt.API.EagerLoaderTest.Fake]] + opts = [[module: FarmbotExt.EagerLoaderTest.Fake]] actual = EagerLoader.child_spec(Fake) expected = %{ - id: {FarmbotExt.API.EagerLoader, FarmbotExt.API.EagerLoaderTest.Fake}, + id: {FarmbotExt.EagerLoader, FarmbotExt.EagerLoaderTest.Fake}, restart: :permanent, shutdown: 500, - start: {FarmbotExt.API.EagerLoader, :start_link, opts}, + start: {FarmbotExt.EagerLoader, :start_link, opts}, type: :worker } diff --git a/farmbot_ext/test/farmbot_ext/bootstrap_test.exs b/farmbot_ext/test/farmbot_ext/bootstrap_test.exs index 6f7efcf5c..3d62848c1 100644 --- a/farmbot_ext/test/farmbot_ext/bootstrap_test.exs +++ b/farmbot_ext/test/farmbot_ext/bootstrap_test.exs @@ -13,7 +13,7 @@ defmodule FarmbotExt.BootstrapTest do {:error, "Bad email or password."} end) - expect(FarmbotCeleryScript.SysCalls, :factory_reset, 1, fn "farmbot_os" -> :ok end) + expect(FarmbotCore.Celery.SysCalls, :factory_reset, 1, fn "farmbot_os" -> :ok end) run_test = fn -> assert Bootstrap.try_auth("", "", "", "") == {:noreply, nil, 0} diff --git a/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs b/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs index 1cf34471e..81ae5a0a0 100644 --- a/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs +++ b/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs @@ -6,7 +6,7 @@ defmodule FarmbotExt.SyncHandlerSupportTest do alias FarmbotExt.MQTT.SyncHandler, as: State alias FarmbotCore.{BotState, JSON, Leds, Asset} alias FarmbotExt.MQTT - alias FarmbotExt.API.EagerLoader + alias FarmbotExt.EagerLoader @fake_state %State{ client_id: "fboslol", diff --git a/farmbot_ext/test/test_helper.exs b/farmbot_ext/test/test_helper.exs index 7e0b6d1a7..1bbc750b1 100644 --- a/farmbot_ext/test/test_helper.exs +++ b/farmbot_ext/test/test_helper.exs @@ -4,8 +4,8 @@ Application.ensure_all_started(:mimic) [ Ecto.Changeset, ExTTY, - FarmbotCeleryScript.SysCalls, - FarmbotCeleryScript.SysCalls.Stubs, + FarmbotCore.Celery.SysCalls, + FarmbotCore.Celery.SysCalls.Stubs, FarmbotCore.Asset.Command, FarmbotCore.Asset.Private, FarmbotCore.Asset.Repo, @@ -16,8 +16,8 @@ Application.ensure_all_started(:mimic) FarmbotCore.LogExecutor, FarmbotCore.Logger, FarmbotExt.API, - FarmbotExt.API.EagerLoader, - FarmbotExt.API.EagerLoader.Supervisor, + FarmbotExt.EagerLoader, + FarmbotExt.EagerLoader.Supervisor, FarmbotExt.API.Preloader, FarmbotExt.API.Reconciler, FarmbotExt.API.SyncGroup, diff --git a/farmbot_os/config/config.exs b/farmbot_os/config/config.exs index 9ca4fc101..6af899e6a 100644 --- a/farmbot_os/config/config.exs +++ b/farmbot_os/config/config.exs @@ -26,8 +26,7 @@ config :farmbot_core, FarmbotCore.EctoMigrator, "beta" ) -config :farmbot_core, FarmbotCeleryScript.SysCalls, - sys_calls: FarmbotOS.SysCalls +config :farmbot_core, FarmbotCore.Celery.SysCalls, sys_calls: FarmbotOS.SysCalls config :farmbot_core, FarmbotCore.BotState.FileSystem, root_dir: "/tmp/farmbot_state" diff --git a/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex b/farmbot_os/lib/farmbot_os/configurator/logger_backend.ex similarity index 94% rename from farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex rename to farmbot_os/lib/farmbot_os/configurator/logger_backend.ex index 302ece5be..0e1534bb0 100644 --- a/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex +++ b/farmbot_os/lib/farmbot_os/configurator/logger_backend.ex @@ -1,4 +1,4 @@ -defmodule FarmbotOS.Configurator.LoggerSocket.LoggerBackend do +defmodule FarmbotOS.Configurator.LoggerBackend do @moduledoc """ Logger backend for LoggerSockets to subscribe too """ diff --git a/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex b/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex index 86ee38352..bd6dc8650 100644 --- a/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex +++ b/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex @@ -3,7 +3,7 @@ defmodule FarmbotOS.Configurator.LoggerSocket do WebSocket handler for streaming logs """ - alias FarmbotOS.Configurator.LoggerSocket.LoggerBackend + alias FarmbotOS.Configurator.LoggerBackend require Logger @behaviour :cowboy_websocket diff --git a/farmbot_os/lib/farmbot_os/lua.ex b/farmbot_os/lib/farmbot_os/lua.ex index d71642570..6faf56d56 100644 --- a/farmbot_os/lib/farmbot_os/lua.ex +++ b/farmbot_os/lib/farmbot_os/lua.ex @@ -9,7 +9,7 @@ defmodule FarmbotOS.Lua do require FarmbotCore.Logger require Logger - alias FarmbotOS.Lua.Ext.{ + alias FarmbotOS.Lua.{ DataManipulation, Firmware, Info, diff --git a/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex b/farmbot_os/lib/farmbot_os/lua/data_manipulation.ex similarity index 98% rename from farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex rename to farmbot_os/lib/farmbot_os/lua/data_manipulation.ex index a64f78203..03dd5d5bd 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex +++ b/farmbot_os/lib/farmbot_os/lua/data_manipulation.ex @@ -1,4 +1,4 @@ -defmodule FarmbotOS.Lua.Ext.DataManipulation do +defmodule FarmbotOS.Lua.DataManipulation do @moduledoc """ Extensions for manipulating data from Lua """ @@ -8,7 +8,7 @@ defmodule FarmbotOS.Lua.Ext.DataManipulation do alias FarmbotOS.Lua.Util alias FarmbotOS.SysCalls.ResourceUpdate alias FarmbotTelemetry.HTTP - alias FarmbotCeleryScript.SpecialValue + alias FarmbotCore.Celery.SpecialValue @methods %{ "connect" => :connect, diff --git a/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex b/farmbot_os/lib/farmbot_os/lua/firmware.ex similarity index 98% rename from farmbot_os/lib/farmbot_os/lua/ext/firmware.ex rename to farmbot_os/lib/farmbot_os/lua/firmware.ex index 95771fc61..fd7dee503 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex +++ b/farmbot_os/lib/farmbot_os/lua/firmware.ex @@ -1,10 +1,10 @@ -defmodule FarmbotOS.Lua.Ext.Firmware do +defmodule FarmbotOS.Lua.Firmware do @moduledoc """ Lua extensions for interacting with the Firmware """ @axis ["x", "y", "z"] - alias FarmbotCeleryScript.SysCalls + alias FarmbotCore.Celery.SysCalls alias FarmbotCore.Firmware.Command def calibrate([axis], lua) when axis in @axis do diff --git a/farmbot_os/lib/farmbot_os/lua/ext/info.ex b/farmbot_os/lib/farmbot_os/lua/info.ex similarity index 97% rename from farmbot_os/lib/farmbot_os/lua/ext/info.ex rename to farmbot_os/lib/farmbot_os/lua/info.ex index 06f5dbcd8..e5c279049 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/info.ex +++ b/farmbot_os/lib/farmbot_os/lua/info.ex @@ -1,9 +1,9 @@ -defmodule FarmbotOS.Lua.Ext.Info do +defmodule FarmbotOS.Lua.Info do @moduledoc """ Lua extensions for gathering information about a running Farmbot """ - alias FarmbotCeleryScript.SysCalls + alias FarmbotCore.Celery.SysCalls alias FarmbotOS.Lua.Util alias FarmbotCore.Config diff --git a/farmbot_os/lib/farmbot_os/lua/ext/wait.ex b/farmbot_os/lib/farmbot_os/lua/wait.ex similarity index 82% rename from farmbot_os/lib/farmbot_os/lua/ext/wait.ex rename to farmbot_os/lib/farmbot_os/lua/wait.ex index d36337e48..91824dcba 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/wait.ex +++ b/farmbot_os/lib/farmbot_os/lua/wait.ex @@ -1,5 +1,5 @@ -defmodule FarmbotOS.Lua.Ext.Wait do - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotOS.Lua.Wait do + alias FarmbotCore.Celery.SysCalls @three_minutes 60 * 1000 * 3 @error "Do not use sleep for longer than three minutes." diff --git a/farmbot_os/lib/farmbot_os/sys_calls.ex b/farmbot_os/lib/farmbot_os/sys_calls.ex index bc56eb09f..8af6a58e3 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls.ex @@ -1,13 +1,13 @@ defmodule FarmbotOS.SysCalls do @moduledoc """ - Implementation for FarmbotCeleryScript.SysCalls + Implementation for FarmbotCore.Celery.SysCalls """ require FarmbotCore.Logger require FarmbotTelemetry require Logger - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST alias FarmbotCore.Asset alias FarmbotCore.BotState alias FarmbotCore.Leds @@ -43,7 +43,7 @@ defmodule FarmbotOS.SysCalls do SetPinIOMode } - @behaviour FarmbotCeleryScript.SysCalls + @behaviour FarmbotCore.Celery.SysCalls @impl true defdelegate send_message(level, message, channels), to: SendMessage diff --git a/farmbot_os/lib/farmbot_os/sys_calls/check_update.ex b/farmbot_os/lib/farmbot_os/sys_calls/check_update.ex index b2868094d..5ada0f726 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/check_update.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/check_update.ex @@ -31,7 +31,7 @@ defmodule FarmbotOS.SysCalls.CheckUpdate do def done(progress_pid) do UpdateProgress.set(progress_pid, 100) - FarmbotCeleryScript.SysCalls.reboot() + FarmbotCore.Celery.SysCalls.reboot() end # Try to find the upgrade image URL (might be `nil`) diff --git a/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex b/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex index f0d0211b3..350695632 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex +++ b/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex @@ -56,9 +56,9 @@ defmodule FarmbotOS.SysCalls.SendMessage do {:ok, [ - x: FarmbotCeleryScript.FormatUtil.format_float(x), - y: FarmbotCeleryScript.FormatUtil.format_float(y), - z: FarmbotCeleryScript.FormatUtil.format_float(z) + x: FarmbotCore.Celery.FormatUtil.format_float(x), + y: FarmbotCore.Celery.FormatUtil.format_float(y), + z: FarmbotCore.Celery.FormatUtil.format_float(z) ]} end @@ -67,7 +67,7 @@ defmodule FarmbotOS.SysCalls.SendMessage do FarmbotCore.BotState.fetch().pins |> Map.new() |> Enum.map(fn {p, %{value: v}} -> - {:"pin#{p}", FarmbotCeleryScript.FormatUtil.format_float(v)} + {:"pin#{p}", FarmbotCore.Celery.FormatUtil.format_float(v)} end)} end diff --git a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs b/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs index 9a491659e..f79a758ec 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs +++ b/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs @@ -1,9 +1,9 @@ -defmodule FarmbotOS.Lua.Ext.DataManipulationTest do +defmodule FarmbotOS.Lua.DataManipulationTest do use ExUnit.Case use Mimic setup :verify_on_exit! alias FarmbotOS.SysCalls.ResourceUpdate - alias FarmbotOS.Lua.Ext.DataManipulation + alias FarmbotOS.Lua.DataManipulation # Random tidbits needed for mocks / stubs. defstruct [:key, :value] @@ -100,7 +100,7 @@ defmodule FarmbotOS.Lua.Ext.DataManipulationTest do end test "soil_height" do - expect(FarmbotCeleryScript.SpecialValue, :soil_height, 1, fn params -> + expect(FarmbotCore.Celery.SpecialValue, :soil_height, 1, fn params -> assert params.x == 9.9 assert params.y == 8.8 5.55 diff --git a/farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs b/farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs index 121782447..e56fd9a13 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs +++ b/farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotOS.Lua.Ext.FirmwareTest do - alias FarmbotOS.Lua.Ext.Firmware - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotOS.Lua.FirmwareTest do + alias FarmbotOS.Lua.Firmware + alias FarmbotCore.Celery.SysCalls use ExUnit.Case use Mimic setup :verify_on_exit! diff --git a/farmbot_os/test/farmbot_os/lua/ext/info_test.exs b/farmbot_os/test/farmbot_os/lua/ext/info_test.exs index 9acdcee12..87cffced2 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/info_test.exs +++ b/farmbot_os/test/farmbot_os/lua/ext/info_test.exs @@ -1,4 +1,4 @@ -defmodule FarmbotOS.Lua.Ext.InfoTest do +defmodule FarmbotOS.Lua.InfoTest do use ExUnit.Case use Mimic setup :verify_on_exit! diff --git a/farmbot_os/test/farmbot_os/lua/ext/wait_test.exs b/farmbot_os/test/farmbot_os/lua/ext/wait_test.exs index 48744430d..2367e60c9 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/wait_test.exs +++ b/farmbot_os/test/farmbot_os/lua/ext/wait_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotOS.Lua.Ext.WaitTest do - alias FarmbotOS.Lua.Ext.Wait - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotOS.Lua.WaitTest do + alias FarmbotOS.Lua.Wait + alias FarmbotCore.Celery.SysCalls use ExUnit.Case use Mimic diff --git a/farmbot_os/test/farmbot_os/lua_test.exs b/farmbot_os/test/farmbot_os/lua_test.exs index 8909a2356..282393a08 100644 --- a/farmbot_os/test/farmbot_os/lua_test.exs +++ b/farmbot_os/test/farmbot_os/lua_test.exs @@ -5,7 +5,7 @@ defmodule FarmbotOS.LuaTest do alias FarmbotCore.Firmware.Command alias FarmbotOS.Lua - alias FarmbotOS.Lua.Ext.{ + alias FarmbotOS.Lua.{ Firmware, Info, DataManipulation @@ -131,7 +131,7 @@ defmodule FarmbotOS.LuaTest do Enum.map(@documentation_examples, fn lua -> result = - FarmbotCeleryScript.Compiler.Lua.do_lua(lua, %{ + FarmbotCore.Celery.Compiler.Lua.do_lua(lua, %{ declarations: %{"parent" => %{"x" => 1000}} }) diff --git a/farmbot_os/test/farmbot_os/syscalls/check_update_test.exs b/farmbot_os/test/farmbot_os/syscalls/check_update_test.exs index 4bac37928..7fefa81fe 100644 --- a/farmbot_os/test/farmbot_os/syscalls/check_update_test.exs +++ b/farmbot_os/test/farmbot_os/syscalls/check_update_test.exs @@ -52,7 +52,7 @@ defmodule FarmbotOS.SysCalls.CheckUpdateTest do :ok end) - expect(FarmbotCeleryScript.SysCalls, :reboot, 1, fn -> + expect(FarmbotCore.Celery.SysCalls, :reboot, 1, fn -> :ok end) diff --git a/farmbot_os/test/test_helper.exs b/farmbot_os/test/test_helper.exs index a961e698f..525adf36c 100644 --- a/farmbot_os/test/test_helper.exs +++ b/farmbot_os/test/test_helper.exs @@ -1,8 +1,8 @@ Application.ensure_all_started(:mimic) [ - FarmbotCeleryScript.SpecialValue, - FarmbotCeleryScript.SysCalls, + FarmbotCore.Celery.SpecialValue, + FarmbotCore.Celery.SysCalls, FarmbotCore.Asset, FarmbotCore.Asset.Device, FarmbotCore.Asset.FbosConfig, @@ -21,9 +21,9 @@ Application.ensure_all_started(:mimic) FarmbotOS.Configurator.ConfigDataLayer, FarmbotOS.Configurator.DetsTelemetryLayer, FarmbotOS.Configurator.FakeNetworkLayer, - FarmbotOS.Lua.Ext.DataManipulation, - FarmbotOS.Lua.Ext.Firmware, - FarmbotOS.Lua.Ext.Info, + FarmbotOS.Lua.DataManipulation, + FarmbotOS.Lua.Firmware, + FarmbotOS.Lua.Info, FarmbotOS.SysCalls, FarmbotOS.SysCalls.ChangeOwnership.Support, FarmbotOS.SysCalls.Farmware, From 3c658ad51ea020c7159f63fd853142b40675ab7c Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Fri, 1 Oct 2021 07:26:08 -0500 Subject: [PATCH 06/15] Updates to `run_all.sh`, test upkeep. (#1406) * Make reboot logs type `busy`, not `debug`. * Updates to run_all.sh --- CHANGELOG.md | 3 ++- VERSION | 2 +- farmbot_core/lib/celery/compilers/lua.ex | 15 ++++++++++----- .../farmbot_celery_script/lua_compiler_test.exs | 15 +++++++++++++++ farmbot_os/lib/farmbot_os/lua.ex | 4 ++++ farmbot_os/lib/farmbot_os/system.ex | 2 +- farmbot_os/mix.exs | 2 +- farmbot_os/mix.lock | 2 +- run_all.sh | 8 ++++---- 9 files changed, 39 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0763cf59a..d650e8f4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # Changelog -# 14.4.2 +# 14.5.0 * SSL/HTTPS configuration updates. + * Upgrade Lua runtime. # 14.4.1 diff --git a/VERSION b/VERSION index 184baa493..94f7337d4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.4.2-rc0 +14.5.0-rc1 diff --git a/farmbot_core/lib/celery/compilers/lua.ex b/farmbot_core/lib/celery/compilers/lua.ex index 6c9762735..8c22d1f45 100644 --- a/farmbot_core/lib/celery/compilers/lua.ex +++ b/farmbot_core/lib/celery/compilers/lua.ex @@ -10,19 +10,24 @@ defmodule FarmbotCore.Celery.Compiler.Lua do end end - def do_lua(lua, cs_scope) do + def do_lua(lua_state, cs_scope) do + # Alias `variable()` and `variables()` for convenience. + aliases = [:variable, :variables] + lookup = generate_lookup_fn(cs_scope) + args = Enum.map(aliases, fn name -> [[name], lookup] end) + SysCalls.perform_lua(lua_state, args, nil) + end + + def generate_lookup_fn(cs_scope) do go = fn label, lua -> {:ok, variable} = Scope.fetch!(cs_scope, label) {VariableTransformer.run!(variable), lua} end - lookup = fn + fn [label], lua -> go.(label, lua) [], lua -> go.("parent", lua) _, _ -> %{error: "Invalid input. Please pass 1 variable name (string)."} end - - args = [[[:variables], lookup], [[:variable], lookup]] - SysCalls.perform_lua(lua, args, nil) end end diff --git a/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs b/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs index dac25e521..b48281f09 100644 --- a/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs +++ b/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs @@ -3,6 +3,21 @@ defmodule FarmbotCore.Celery.LuaTest do alias FarmbotCore.Celery.Compiler.Lua alias FarmbotCore.Celery.Compiler.Scope + test "variable lookup" do + variable = %{"x" => 1000} + cs_scope = %{declarations: %{"parent" => variable}} + lookup = Lua.generate_lookup_fn(cs_scope) + one = lookup.([], :the_state) + two = lookup.(["parent"], :the_state) + three = lookup.(["foo", "bar"], :the_state) + assert one == {[variable], :the_state} + assert two == {[variable], :the_state} + + assert three == %{ + error: "Invalid input. Please pass 1 variable name (string)." + } + end + test "conversion of `cs_scope` to luerl params" do cs_scope = %Scope{ declarations: %{ diff --git a/farmbot_os/lib/farmbot_os/lua.ex b/farmbot_os/lib/farmbot_os/lua.ex index 6faf56d56..e2ad80fe3 100644 --- a/farmbot_os/lib/farmbot_os/lua.ex +++ b/farmbot_os/lib/farmbot_os/lua.ex @@ -76,6 +76,10 @@ defmodule FarmbotOS.Lua do {:error, "failed to parse expression (line:#{line}): #{IO.iodata_to_binary(parse_error)}"} + {:error, error, backtrace} -> + IO.inspect(backtrace, label: "=== LUA ERROR TRACE") + {:error, error} + {:error, error} -> {:error, error} diff --git a/farmbot_os/lib/farmbot_os/system.ex b/farmbot_os/lib/farmbot_os/system.ex index 45f84f4e5..a256a4219 100644 --- a/farmbot_os/lib/farmbot_os/system.ex +++ b/farmbot_os/lib/farmbot_os/system.ex @@ -74,7 +74,7 @@ defmodule FarmbotOS.System do end def set_shutdown_reason(reason) do - FarmbotCore.Logger.debug(3, reason) + FarmbotCore.Logger.busy(1, reason) file = FarmbotOS.FileSystem.shutdown_reason_path() if reason, do: File.write!(file, inspect(reason)), else: File.rm_rf(file) end diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index 1cfe0d868..be323ec3c 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -104,7 +104,7 @@ defmodule FarmbotOS.MixProject do runtime: false, targets: :rpi3}, {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:luerl, github: "rvirding/luerl"}, + {:luerl, github: "rvirding/luerl", tag: "1.0"}, {:mdns_lite, "~> 0.7.0", targets: @all_targets}, {:nerves_firmware_ssh, "~> 0.4.6", targets: @all_targets}, {:nerves_runtime, "~> 0.11.6", targets: @all_targets}, diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index 07287c384..541bbcc10 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -40,7 +40,7 @@ "jsx": {:hex, :jsx, "2.11.0", "08154624050333919b4ac1b789667d5f4db166dc50e190c4d778d1587f102ee0", [:rebar3], [], "hexpm", "eed26a0d04d217f9eecefffb89714452556cf90eb38f290a27a4d45b9988f8c0"}, "lager": {:hex, :lager, "3.8.0", "3402b9a7e473680ca179fc2f1d827cab88dd37dd1e6113090c6f45ef05228a1c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "f6cb541b688eab60730d8d286eb77256a5a9ad06eac10d43beaf55d07e68bbb6"}, "luer": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, - "luerl": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, + "luerl": {:git, "https://github.com/rvirding/luerl.git", "836d08ad3287d73d9c91cb11a590de15a1761027", [tag: "1.0"]}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, diff --git a/run_all.sh b/run_all.sh index 5cb56c5e6..160477e83 100755 --- a/run_all.sh +++ b/run_all.sh @@ -9,32 +9,32 @@ cd farmbot_telemetry echo "######### farmbot_telemetry" cd ../farmbot_telemetry -mix format mix deps.get --all +mix format MIX_ENV=test mix compile --force mix coveralls.html rm -f *.coverdata echo "######### farmbot_core" cd ../farmbot_core -mix format mix deps.get --all +mix format MIX_ENV=test mix compile --force mix coveralls.html rm -f *.coverdata echo "######### farmbot_ext" cd ../farmbot_ext -mix format mix deps.get --all +mix format MIX_ENV=test mix compile --force mix coveralls.html rm -f *.coverdata echo "######### farmbot_os" cd ../farmbot_os -mix format mix deps.get --all +mix format MIX_ENV=test mix compile --force mix coveralls.html rm -f *.coverdata From 8b58ad1935ac42d9916f1ab6b156f28542af4abb Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 6 Oct 2021 14:33:12 -0500 Subject: [PATCH 07/15] More Dep Upgrades (#1407) * 14.5.0-rc5 - Dep updates (Hackney, Certifi) --- CHANGELOG.md | 2 +- VERSION | 2 +- farmbot_core/mix.exs | 16 ++++++++-------- farmbot_core/mix.lock | 14 +++++++------- farmbot_ext/mix.exs | 2 +- farmbot_ext/mix.lock | 4 ++-- farmbot_os/mix.lock | 4 ++-- farmbot_telemetry/mix.exs | 1 + farmbot_telemetry/mix.lock | 8 ++++---- mix.lock | 10 +++++----- 10 files changed, 32 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d650e8f4f..3e69b99fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ # 14.5.0 * SSL/HTTPS configuration updates. - * Upgrade Lua runtime. + * Upgrade numerouse deps, such as Lua runtime and Certifi. # 14.4.1 diff --git a/VERSION b/VERSION index 94f7337d4..e2e6ee22f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.5.0-rc1 +14.5.0-rc3 diff --git a/farmbot_core/mix.exs b/farmbot_core/mix.exs index f3ecaf37d..7a39f7a9d 100644 --- a/farmbot_core/mix.exs +++ b/farmbot_core/mix.exs @@ -58,15 +58,15 @@ defmodule FarmbotCore.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - {:circuits_uart, "~> 1.4.3"}, - {:ex_doc, "~> 0.25.2", only: [:dev], targets: [:host], runtime: false}, - {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, + {:circuits_uart, "~> 1.4"}, + {:ex_doc, "~> 0.25", only: [:dev], targets: [:host], runtime: false}, + {:excoveralls, "~> 0.14", only: [:test], targets: [:host]}, {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:jason, "~> 1.2.2"}, - {:mimic, "~> 1.5.1", only: :test}, - {:muontrap, "~> 0.6.1"}, - {:sqlite_ecto2, "~> 2.3"}, - {:timex, "~> 3.7.6"} + {:jason, "~> 1.2"}, + {:mimic, "~> 1.5", only: :test}, + {:muontrap, "~> 0.6"}, + {:sqlite_ecto2, "2.3.1"}, + {:timex, "~> 3.7"} ] end diff --git a/farmbot_core/mix.lock b/farmbot_core/mix.lock index e6fb808a4..0837d2073 100644 --- a/farmbot_core/mix.lock +++ b/farmbot_core/mix.lock @@ -1,5 +1,5 @@ %{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, @@ -12,12 +12,12 @@ "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "f1e20ddf41713b4db247443a3bea9045c4103b27c0e64b0c21ec50edde51fba8"}, "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, - "esqlite": {:hex, :esqlite, "0.2.4", "3a8a352c190afe2d6b828b252a6fbff65b5cc1124647f38b15bdab3bf6fd4b3e", [:rebar3], [], "hexpm", "232a51e63d0cd2b6b9d3607ac0e8dd24eca022893d8037ad05b7c71e4168ed40"}, - "ex_doc": {:hex, :ex_doc, "0.25.2", "4f1cae793c4d132e06674b282f1d9ea3bf409bcca027ddb2fe177c4eed6a253f", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5b0c172e87ac27f14dfd152d52a145238ec71a95efbf29849550278c58a393d6"}, - "excoveralls": {:hex, :excoveralls, "0.14.2", "f9f5fd0004d7bbeaa28ea9606251bb643c313c3d60710bad1f5809c845b748f0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ca6fd358621cb4d29311b29d4732c4d47dac70e622850979bc54ed9a3e50f3e1"}, + "esqlite": {:hex, :esqlite, "0.4.1", "ba5d0bab6b9c8432ffe1bf12fee8e154a50f1c3c40eadc3a9c870c23ca94d961", [:rebar3], [], "hexpm", "3584ca33172f4815ce56e96eed9835f5d8c987a9000fbc8c376c86acef8bf965"}, + "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, + "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, "gen_stage": {:hex, :gen_stage, "0.14.1", "9d46723fda072d4f4bb31a102560013f7960f5d80ea44dcb96fd6304ed61e7a4", [:mix], [], "hexpm"}, "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, @@ -35,12 +35,12 @@ "plug_cowboy": {:hex, :plug_cowboy, "2.0.0", "ab0c92728f2ba43c544cce85f0f220d8d30fc0c90eaa1e6203683ab039655062", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, - "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm", "8f7168911120e13419e086e78d20e4d1a6776f1eee2411ac9f790af10813389f"}, + "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "ranch": {:hex, :ranch, "1.6.2", "6db93c78f411ee033dbb18ba8234c5574883acb9a75af0fb90a9b82ea46afa00", [:rebar3], [], "hexpm"}, "ring_logger": {:hex, :ring_logger, "0.4.1", "db972365bfda705288d7629e80af5704a1aafdbe9da842712c3cdd587639c72e", [:mix], [], "hexpm"}, "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm", "ba952bfa35b374e1e5d84bc5f5efe8360c6f99dc93b3118f714a9a2dff6c9e19"}, "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm", "a588e8e4ab9570c32a03605fabff86f0fee1040530d33edc4fc4392db4d81700"}, - "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm", "0e1974b48684ba85255d2fe16c6106d52f5e759b260c95f676b23aa13b708a96"}, + "sqlitex": {:hex, :sqlitex, "1.7.1", "022d477aab2ae999c43ae6fbd1782ff1457e0e95c251c7b5fa6f7b7b102040ff", [:mix], [{:decimal, "~> 1.7", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm", "ef16cda37b151136a47a6c0830dc9eb5e5f8f5f029b649e9f3a58a6eed634b80"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, diff --git a/farmbot_ext/mix.exs b/farmbot_ext/mix.exs index aef186160..a078d6a13 100644 --- a/farmbot_ext/mix.exs +++ b/farmbot_ext/mix.exs @@ -45,7 +45,7 @@ defmodule FarmbotExt.MixProject do {:extty, "~> 0.2.1"}, {:farmbot_core, path: "../farmbot_core", env: Mix.env()}, {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:hackney, "~> 1.16"}, + {:hackney, "~> 1.18"}, {:mimic, "~> 1.5.1", only: :test}, {:tesla, "~> 1.4.3"}, {:uuid, "~> 1.1.8"} diff --git a/farmbot_ext/mix.lock b/farmbot_ext/mix.lock index fc7b90e40..b2f4af70f 100644 --- a/farmbot_ext/mix.lock +++ b/farmbot_ext/mix.lock @@ -1,7 +1,7 @@ %{ "amqp": {:hex, :amqp, "1.6.0", "736d976f53780bcee72ccc50f7eb36e3d5881354480b1e34ceac84e3bbd954e9", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm", "b8168919ea1f1571a68349421e6501d1db7f559c4db3b8324ae90dbd3e2c1c4a"}, "amqp_client": {:hex, :amqp_client, "3.8.9", "42fb24cfa606f87f77e84604c1ad896c26c236228196a294a07f88f8d2982695", [:make, :rebar3], [{:rabbit_common, "3.8.9", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm", "8ad70be479d2b8c7882aa2908245b490960fe5c619d2edd56eb24f90e1132b60"}, - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, @@ -21,7 +21,7 @@ "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "jsx": {:hex, :jsx, "2.11.0", "08154624050333919b4ac1b789667d5f4db166dc50e190c4d778d1587f102ee0", [:rebar3], [], "hexpm", "eed26a0d04d217f9eecefffb89714452556cf90eb38f290a27a4d45b9988f8c0"}, diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index 541bbcc10..aa45a8d69 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -3,7 +3,7 @@ "amqp_client": {:hex, :amqp_client, "3.8.9", "42fb24cfa606f87f77e84604c1ad896c26c236228196a294a07f88f8d2982695", [:make, :rebar3], [{:rabbit_common, "3.8.9", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm", "8ad70be479d2b8c7882aa2908245b490960fe5c619d2edd56eb24f90e1132b60"}, "beam_notify": {:hex, :beam_notify, "0.2.1", "64f94f5b486b4cc96ef10a633188560cdd6ae2fccaf6fd746851cdc12b85d5f1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "d1b3a8d280867c43c2c53e61556ca5ad87e0907ad25797d2c753bac5d8b3dc44"}, "busybox": {:hex, :busybox, "0.1.5", "a86e8007469d9422c8c7808c2d978688f60e42c77b14f2a849bc4a1223729a8b", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4da1fd2e47ea25a744506520241b201302fef841833a7cb0ed4dace94be23d9f"}, - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "circuits_gpio": {:hex, :circuits_gpio, "0.4.8", "75a62b07131f119c0ffa1dd49f79fbe29c46fd39b20ef0acc036d449fb780b89", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "05e341a5de7e9181a0ee6b3281bd2dc278ae4651825e95c9e83c9eabc421448e"}, "circuits_i2c": {:hex, :circuits_i2c, "0.3.9", "746a599ac06f8d31572143a8c51e1bc787246c173669940dc23e078907fb13e1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "c6d75387637a4fbae77cf37af45000fe23763eb8104cc50e7aae532bec46e91d"}, "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, @@ -34,7 +34,7 @@ "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "jsx": {:hex, :jsx, "2.11.0", "08154624050333919b4ac1b789667d5f4db166dc50e190c4d778d1587f102ee0", [:rebar3], [], "hexpm", "eed26a0d04d217f9eecefffb89714452556cf90eb38f290a27a4d45b9988f8c0"}, diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs index b6baba32b..f9351609f 100644 --- a/farmbot_telemetry/mix.exs +++ b/farmbot_telemetry/mix.exs @@ -53,6 +53,7 @@ defmodule FarmbotTelemetry.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ + {:certifi, "~> 2.8"}, {:telemetry, "~> 1.0.0"}, {:uuid, "~> 1.1.8"}, {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, diff --git a/farmbot_telemetry/mix.lock b/farmbot_telemetry/mix.lock index dbcf2485f..f939c3d06 100644 --- a/farmbot_telemetry/mix.lock +++ b/farmbot_telemetry/mix.lock @@ -1,12 +1,12 @@ %{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.7", "6287f8f2cb45df8584317a4be1075b8c9b8a69de8eeb82b4d9e6c761cf2664cd", [:mix], [{:erlex, ">= 0.2.5", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "506294d6c543e4e5282d4852aead19ace8a35bedeb043f9256a06a6336827122"}, "earmark": {:hex, :earmark, "1.4.2", "3aa0bd23bc4c61cf2f1e5d752d1bb470560a6f8539974f767a38923bb20e1d7f", [:mix], [], "hexpm", "5e8806285d8a3a8999bd38e4a73c58d28534c856bc38c44818e5ba85bbda16fb"}, "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, "erlex": {:hex, :erlex, "0.2.5", "e51132f2f472e13d606d808f0574508eeea2030d487fc002b46ad97e738b0510", [:mix], [], "hexpm", "756d3e19b056339af674b715fdd752c5dac468cf9d0e2d1a03abf4574e99fbf8"}, - "ex_doc": {:hex, :ex_doc, "0.25.2", "4f1cae793c4d132e06674b282f1d9ea3bf409bcca027ddb2fe177c4eed6a253f", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5b0c172e87ac27f14dfd152d52a145238ec71a95efbf29849550278c58a393d6"}, - "excoveralls": {:hex, :excoveralls, "0.14.2", "f9f5fd0004d7bbeaa28ea9606251bb643c313c3d60710bad1f5809c845b748f0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ca6fd358621cb4d29311b29d4732c4d47dac70e622850979bc54ed9a3e50f3e1"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, + "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, + "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, diff --git a/mix.lock b/mix.lock index f2319faeb..91b944b4a 100644 --- a/mix.lock +++ b/mix.lock @@ -1,12 +1,12 @@ %{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, + "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.7", "6287f8f2cb45df8584317a4be1075b8c9b8a69de8eeb82b4d9e6c761cf2664cd", [:mix], [{:erlex, ">= 0.2.5", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "506294d6c543e4e5282d4852aead19ace8a35bedeb043f9256a06a6336827122"}, "earmark": {:hex, :earmark, "1.4.1", "07bb382826ee8d08d575a1981f971ed41bd5d7e86b917fd012a93c51b5d28727", [:mix], [], "hexpm", "cdfa03374331187c7b9e86d971423a19138dc1cf9902b26923a657c789673876"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.13", "0c98163e7d04a15feb62000e1a891489feb29f3d10cb57d4f845c405852bbef8", [:mix], [], "hexpm", "d602c26af3a0af43d2f2645613f65841657ad6efc9f0e361c3b6c06b578214ba"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, "erlex": {:hex, :erlex, "0.2.5", "e51132f2f472e13d606d808f0574508eeea2030d487fc002b46ad97e738b0510", [:mix], [], "hexpm", "756d3e19b056339af674b715fdd752c5dac468cf9d0e2d1a03abf4574e99fbf8"}, - "ex_doc": {:hex, :ex_doc, "0.24.2", "e4c26603830c1a2286dae45f4412a4d1980e1e89dc779fcd0181ed1d5a05c8d9", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "e134e1d9e821b8d9e4244687fb2ace58d479b67b282de5158333b0d57c6fb7da"}, - "excoveralls": {:hex, :excoveralls, "0.14.1", "14140e4ef343f2af2de33d35268c77bc7983d7824cb945e6c2af54235bc2e61f", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "4a588f9f8cf9dc140cc1f3d0ea4d849b2f76d5d8bee66b73c304bb3d3689c8b0"}, - "hackney": {:hex, :hackney, "1.17.4", "99da4674592504d3fb0cfef0db84c3ba02b4508bae2dff8c0108baa0d6e0977c", [:rebar3], [{:certifi, "~>2.6.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "de16ff4996556c8548d512f4dbe22dd58a587bf3332e7fd362430a7ef3986b16"}, + "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, + "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, + "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, From 214bc2e0b34382bd6a8c8182fae35dc55cf2ddcb Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Sat, 9 Oct 2021 10:10:50 -0500 Subject: [PATCH 08/15] Framing updates, dep updates, farm event scheduler bug fixes. * Dep updates * Fix a rare case where FarmEvent occurrences fail to execute after FBOS Re-Boot on Express machines. * Improve CPU efficiency on Express bots in Firmware by using the C-based code in Circuits.UART to perform the Line Framing for the Farmduino MCU serial link. * Test coverage updates Co-authored-by: John Simmonds --- .../farm_event_worker/sequence_event.ex | 21 ++++-- .../lib/firmware/inbound_side_effects.ex | 2 +- farmbot_core/lib/firmware/rx_buffer.ex | 66 ++----------------- farmbot_core/lib/firmware/uart_core.ex | 4 +- .../lib/firmware/uart_core_support.ex | 11 +++- farmbot_core/mix.exs | 1 + farmbot_core/mix.lock | 1 + .../farm_event_worker/sequence_event_test.exs | 49 ++++++++++++++ farmbot_core/test/firmware/rx_buffer_test.exs | 35 ---------- farmbot_core/test/firmware/tx_buffer_test.exs | 2 +- farmbot_core/test/firmware/uart_core_test.exs | 36 ++++------ farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex | 17 +++-- farmbot_ext/mix.exs | 4 +- farmbot_ext/mix.lock | 9 +-- .../test/farmbot_ext/mqtt/mqtt_test.exs | 25 +++++++ farmbot_ext/test/test_helper.exs | 11 ++-- farmbot_os/mix.exs | 6 +- farmbot_os/mix.lock | 20 +++--- farmbot_telemetry/mix.exs | 2 +- mix.exs | 2 +- 20 files changed, 162 insertions(+), 162 deletions(-) diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex index 040b0cfe6..2529771a7 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex @@ -11,22 +11,29 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do @impl GenServer def init([farm_event, args]) do send self(), :schedule - {:ok, %{farm_event: farm_event, args: args}} + {:ok, %{farm_event: farm_event, args: args, scheduled: 0, timesync_waits: 0}} end @impl GenServer def handle_info(:schedule, state) do farm_event = state.farm_event - farm_event - |> FarmEvent.build_calendar(DateTime.utc_now()) - # get rid of any item that has already been scheduled/executed - |> Enum.reject(fn(scheduled_at) -> - Asset.get_farm_event_execution(farm_event, scheduled_at) - end) + occurrences = + farm_event + |> FarmEvent.build_calendar(DateTime.utc_now()) + # get rid of any item that has already been scheduled/executed + |> Enum.reject(fn(scheduled_at) -> + Asset.get_farm_event_execution(farm_event, scheduled_at) + end) + occurrences |> Enum.each(fn(at) -> schedule_sequence(farm_event, at) end) + {:noreply, %{state | scheduled: state.scheduled + length(occurrences)}} + end + + def handle_info(:timeout, state) do + Process.send_after(self(), :schedule, 1_000) {:noreply, state} end diff --git a/farmbot_core/lib/firmware/inbound_side_effects.ex b/farmbot_core/lib/firmware/inbound_side_effects.ex index 357a9d3cc..3103bfb21 100644 --- a/farmbot_core/lib/firmware/inbound_side_effects.ex +++ b/farmbot_core/lib/firmware/inbound_side_effects.ex @@ -115,7 +115,7 @@ defmodule FarmbotCore.Firmware.InboundSideEffects do end defp reduce({:echo, echo_string}, state) do - clean_echo = String.replace(echo_string, "*", "") + clean_echo = String.replace(echo_string, ["\r", "*"], "") next_txb = TxBuffer.process_echo(state.tx_buffer, clean_echo) if echo_string == "*F09*" do diff --git a/farmbot_core/lib/firmware/rx_buffer.ex b/farmbot_core/lib/firmware/rx_buffer.ex index 4bea42677..43bccb361 100644 --- a/farmbot_core/lib/firmware/rx_buffer.ex +++ b/farmbot_core/lib/firmware/rx_buffer.ex @@ -26,15 +26,13 @@ defmodule FarmbotCore.Firmware.RxBuffer do defstruct output: [], buffer: "", ready: false - @new_line "\n" - @doc ~S""" Create a new line buffer object. - iex> new("r88 Q00\n") + iex> new("r88 Q00") %FarmbotCore.Firmware.RxBuffer{ buffer: "", - output: [], + output: ["R88 Q00"], ready: true } """ @@ -53,27 +51,7 @@ defmodule FarmbotCore.Firmware.RxBuffer do } """ def puts(state, string) do - string - |> String.upcase() - |> String.replace(~r/\r*/, "") - |> String.replace(~r/\r/, @new_line) - |> String.replace(~r/\ +/, " ") - |> String.replace(~r/\n+/, @new_line) - |> String.split("") - |> Enum.filter(fn - "" -> false - _ -> true - end) - |> Enum.reduce(state, fn - @new_line, %{ready: false} -> - %State{output: [], buffer: "", ready: true} - - _, %{ready: false} = state -> - state - - char, state -> - step(state, char) - end) + %{state | output: [String.upcase(string)], ready: true} end @doc ~S""" @@ -87,46 +65,14 @@ defmodule FarmbotCore.Firmware.RxBuffer do ...> |> gets() { %RxBuffer{ - buffer: "R99 INCOMPLETE DATA", + buffer: "", output: [], ready: true }, - ["R99 ARDUINO STARTUP COMPLETE"] + ["R99 INCOMPLETE DATA"] } """ def gets(state) do - results = - state.output - |> Enum.chunk_by(fn token -> token == @new_line end) - |> Enum.map(fn chunk -> Enum.join(chunk, " ") end) - |> Enum.join(" ") - |> String.replace(~r/\n /, @new_line) - |> String.split(~r/\n/) - |> Enum.filter(fn - # Valid GCode messages start with "R". - # Throw away anything that doesn't. - "R" <> _ -> true - "" -> false - s -> oh_no(s) - end) - - finalize(state, results) - end - - defp finalize(state, results) do - {%{state | output: []}, results} - end - - defp step(last_state, @new_line) do - next_output = last_state.output ++ ["#{last_state.buffer}\n"] - %{last_state | output: next_output, buffer: ""} - end - - defp step(p, char), do: %{p | buffer: "#{p.buffer}#{char}"} - - @oh_no "===== DONT KNOW HOW TO HANDLE THIS: " - defp oh_no(s) do - Logger.debug(@oh_no <> inspect(s)) - false + {%{state | output: []}, state.output} end end diff --git a/farmbot_core/lib/firmware/uart_core.ex b/farmbot_core/lib/firmware/uart_core.ex index ffaa1fc25..4e14962ca 100644 --- a/farmbot_core/lib/firmware/uart_core.ex +++ b/farmbot_core/lib/firmware/uart_core.ex @@ -110,7 +110,7 @@ defmodule FarmbotCore.Firmware.UARTCore do # treatment. It skips all queing mechanisms and dumps # any tasks that were already queued. def handle_info({:send_raw, "E"}, %State{} = state) do - Support.uart_send(state.uart_pid, "E\r\n") + Support.uart_send(state.uart_pid, "E") msg = "Emergency locked" txb = TxBuffer.error_all(state.tx_buffer, msg) Support.lock!() @@ -119,7 +119,7 @@ defmodule FarmbotCore.Firmware.UARTCore do # === SCENARIO: Direct GCode transmission without queueing def handle_info({:send_raw, text}, %State{} = state) do - Support.uart_send(state.uart_pid, "#{text}\r\n") + Support.uart_send(state.uart_pid, text) {:noreply, state} end diff --git a/farmbot_core/lib/firmware/uart_core_support.ex b/farmbot_core/lib/firmware/uart_core_support.ex index be3982fab..774520cc8 100644 --- a/farmbot_core/lib/firmware/uart_core_support.ex +++ b/farmbot_core/lib/firmware/uart_core_support.ex @@ -4,7 +4,12 @@ defmodule FarmbotCore.Firmware.UARTCoreSupport do defstruct path: "null", uart_pid: nil alias FarmbotCore.BotState - @default_opts [active: true, speed: 115_200] + @default_opts [ + active: true, + speed: 115_200, + framing: {Circuits.UART.Framing.Line, separator: "\r\n"}, + rx_framing_timeout: 200 + ] @three_minutes 3 * 60 * 1000 def uptime_ms() do @@ -46,8 +51,8 @@ defmodule FarmbotCore.Firmware.UARTCoreSupport do end def uart_send(uart_pid, text) do - Logger.info(" == SEND RAW: #{inspect(text)}") - :ok = Circuits.UART.write(uart_pid, text <> "\r\n") + # Logger.info(" == SEND RAW: #{inspect(text)}") + :ok = Circuits.UART.write(uart_pid, text) end def lock!(), do: BotState.set_firmware_locked() diff --git a/farmbot_core/mix.exs b/farmbot_core/mix.exs index 7a39f7a9d..9246e0199 100644 --- a/farmbot_core/mix.exs +++ b/farmbot_core/mix.exs @@ -65,6 +65,7 @@ defmodule FarmbotCore.MixProject do {:jason, "~> 1.2"}, {:mimic, "~> 1.5", only: :test}, {:muontrap, "~> 0.6"}, + {:nerves_time, "~> 0.4.3", targets: [:rpi, :rpi3]}, {:sqlite_ecto2, "2.3.1"}, {:timex, "~> 3.7"} ] diff --git a/farmbot_core/mix.lock b/farmbot_core/mix.lock index 0837d2073..173f34048 100644 --- a/farmbot_core/mix.lock +++ b/farmbot_core/mix.lock @@ -28,6 +28,7 @@ "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, "mimic": {:hex, :mimic, "1.5.1", "085f7ebfeb5b579a13a167aec3c712d71fecfc6cb8b298c0dd3056f97ea2c2a0", [:mix], [], "hexpm", "33a50ef9ff38f8f24b2586d52e529981a3ba2b8d061c872084aff0e993bf4bd5"}, "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, + "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, "nerves_uart": {:hex, :nerves_uart, "1.2.0", "195424116b925cd3bf9d666be036c2a80655e6ca0f8d447e277667a60005c50e", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, diff --git a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs b/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs index 4a3776bc8..903835bbd 100644 --- a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs +++ b/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs @@ -1,11 +1,60 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do use ExUnit.Case + use Mimic alias FarmbotCore.FarmEventWorker.SequenceEvent + alias FarmbotCore.Asset test "init/1" do arry = [:farm_event, :args] {:ok, %{farm_event: :farm_event, args: :args}} = SequenceEvent.init(arry) assert_receive :schedule, 1000 end + + test "handle_info(:schedule, state)" do + state = %{ + args: [], + farm_event: %FarmbotCore.Asset.FarmEvent{ + body: [], + created_at: ~U[2021-10-08 21:28:19.200000Z], + end_time: ~U[2051-10-09 22:30:00.000000Z], + executable_id: 2, + executable_type: "Sequence", + executions: [], + id: 1, + last_executed: nil, + local_id: "6fae5451-baa8-4368-9612-cfd571384814", + repeat: 1, + start_time: ~U[2051-10-08 21:30:00.000000Z], + time_unit: "hourly", + updated_at: ~U[2051-10-08 21:28:19.294000Z] + }, + scheduled: 25, + timesync_waits: 0 + } + + expect(FarmbotCore.Celery, :schedule, 25, fn celery_ast, _at, farm_event -> + assert %FarmbotCore.Celery.AST{} = celery_ast + assert state.farm_event.id == farm_event.id + :ok + end) + + expect(Asset, :get_sequence, 25, fn executable_id -> + assert executable_id == 2 + + %{ + name: "Test sequence", + id: 44, + kind: "sequence", + args: %{locals: %{kind: :scope_declaration, args: %{}, body: []}}, + body: [] + } + end) + + {:noreply, state2} = SequenceEvent.handle_info(:schedule, state) + + assert state2.farm_event.local_id == state2.farm_event.local_id + assert state2.scheduled == 50 + assert state2.timesync_waits == 0 + end end diff --git a/farmbot_core/test/firmware/rx_buffer_test.exs b/farmbot_core/test/firmware/rx_buffer_test.exs index 017510f73..377f6782b 100644 --- a/farmbot_core/test/firmware/rx_buffer_test.exs +++ b/farmbot_core/test/firmware/rx_buffer_test.exs @@ -2,39 +2,4 @@ defmodule FarmbotCore.Firmware.RxBufferTest do use ExUnit.Case alias FarmbotCore.Firmware.RxBuffer doctest FarmbotCore.Firmware.RxBuffer, import: true - - @random_tokens [ - "", - "\n", - "\r", - " ", - " ", - "R88", - "Y0.00", - "R81", - "XB1", - "r99", - "Q0", - "Q1", - "R99 ARDUINO STARTUP COMPLETE\n" - ] - - test "unexpected input" do - random_text = - 1..1000 - |> Enum.to_list() - |> Enum.map(fn _ -> Enum.random(@random_tokens) end) - |> Enum.join("") - - {_, results} = - random_text - |> RxBuffer.new() - |> RxBuffer.gets() - - Enum.map(results, fn chunk -> - refute chunk =~ "\r", "Contains non-printing char #{inspect(chunk)}" - refute chunk =~ "\n", "Contains non-printing char #{inspect(chunk)}" - refute chunk =~ " ", "Contains double space #{inspect(chunk)}" - end) - end end diff --git a/farmbot_core/test/firmware/tx_buffer_test.exs b/farmbot_core/test/firmware/tx_buffer_test.exs index b57ba2639..2d9f91b1c 100644 --- a/farmbot_core/test/firmware/tx_buffer_test.exs +++ b/farmbot_core/test/firmware/tx_buffer_test.exs @@ -62,7 +62,7 @@ defmodule FarmbotCore.Firmware.TxBufferTest do parent_pid = self() caller = fn -> TxBuffer.process_next_message(@ready_buffer, parent_pid) end spawn_link(caller) - assert_receive {:"$gen_call", {_, _}, {:write, "E Q1\r\n", 5000}}, 888 + assert_receive {:"$gen_call", {_, _}, {:write, "E Q1", 5000}}, 888 end test "process_next_message - Corner case II" do diff --git a/farmbot_core/test/firmware/uart_core_test.exs b/farmbot_core/test/firmware/uart_core_test.exs index 9b1f8fddd..96af80220 100644 --- a/farmbot_core/test/firmware/uart_core_test.exs +++ b/farmbot_core/test/firmware/uart_core_test.exs @@ -72,27 +72,6 @@ defmodule FarmbotCore.Firmware.UARTCoreTest do assert capture_log(t) =~ "Firmware restart initiated" end - test "lifecycle" do - expect(Support, :connect, 1, fn @path -> {:ok, self()} end) - {:ok, pid} = UARTCore.start_link([path: @path], []) - assert is_pid(pid) - noise = fn -> send(pid, "nonsense") end - expected = "UNEXPECTED FIRMWARE MESSAGE: \"nonsense\"" - Process.sleep(800) - assert capture_log(noise) =~ expected - - state1 = :sys.get_state(pid) - refute state1.rx_buffer.ready - - send(pid, {:circuits_uart, "", "r99 "}) - state2 = :sys.get_state(pid) - refute state2.rx_buffer.ready - - send(pid, {:circuits_uart, "", "ARDUINO startup COMPLETE\r\n"}) - state3 = :sys.get_state(pid) - assert state3.rx_buffer.ready - end - test "toggle_logging" do UARTCore.toggle_logging(self()) assert_receive :toggle_logging @@ -180,9 +159,22 @@ defmodule FarmbotCore.Firmware.UARTCoreTest do assert capture_log(t) =~ "Firmware terminated." end + test "handle_info({:send_raw, _}, state)" do + fake_gcode = "G00 X1.0 Y2.0 Z3.0 Q0" + s1 = %UARTCore{} + + expect(Support, :uart_send, 1, fn _uart_pid, msg -> + assert msg == fake_gcode + :ok + end) + + {:noreply, s2} = UARTCore.handle_info({:send_raw, fake_gcode}, s1) + assert s1 == s2 + end + test "handle_info({:send_raw, E}, %State{} = state)" do expect(Support, :uart_send, 1, fn _uart_pid, msg -> - assert msg == "E\r\n" + assert msg == "E" :ok end) diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex b/farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex index b1f226b74..f655a8414 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex +++ b/farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex @@ -26,15 +26,22 @@ defmodule FarmbotExt.MQTT do def init(args) do client_id = Keyword.fetch!(args, :client_id) - opts = [ - client_id: client_id, - username: Keyword.fetch!(args, :username) - ] + supervisor = + new_supervisor( + client_id: client_id, + username: Keyword.fetch!(args, :username) + ) - {:ok, supervisor} = TopicSupervisor.start_link(opts) {:ok, %State{client_id: client_id, supervisor: supervisor}} end + def new_supervisor(opts) do + case TopicSupervisor.start_link(opts) do + {:ok, supervisor} -> supervisor + {:error, {:already_started, supervisor}} -> supervisor + end + end + def handle_message([_, _, "ping", _] = topic, payload, s) do Support.forward_message(PingHandler, {topic, payload}) {:ok, s} diff --git a/farmbot_ext/mix.exs b/farmbot_ext/mix.exs index a078d6a13..3c1211dbc 100644 --- a/farmbot_ext/mix.exs +++ b/farmbot_ext/mix.exs @@ -39,8 +39,8 @@ defmodule FarmbotExt.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - {:tortoise, "~> 0.9.9"}, - {:ex_doc, "~> 0.25.2", only: [:dev], targets: [:host], runtime: false}, + {:tortoise, "~> 0.10"}, + {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false}, {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, {:extty, "~> 0.2.1"}, {:farmbot_core, path: "../farmbot_core", env: Mix.env()}, diff --git a/farmbot_ext/mix.lock b/farmbot_ext/mix.lock index b2f4af70f..3714d7c78 100644 --- a/farmbot_ext/mix.lock +++ b/farmbot_ext/mix.lock @@ -10,13 +10,13 @@ "decimal": {:hex, :decimal, "1.9.0", "83e8daf59631d632b171faabafb4a9f4242c514b0a06ba3df493951c08f64d07", [:mix], [], "hexpm", "b1f2343568eed6928f3e751cf2dffde95bfaa19dd95d09e8a9ea92ccfd6f7d85"}, "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "49496d63267bc1a4614ffd5f67c45d9fc3ea62701a6797975bc98bc156d2763f"}, "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "f1e20ddf41713b4db247443a3bea9045c4103b27c0e64b0c21ec50edde51fba8"}, "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "erlex": {:hex, :erlex, "0.2.1", "cee02918660807cbba9a7229cae9b42d1c6143b768c781fa6cee1eaf03ad860b", [:mix], [], "hexpm", "df65aa8e1e926941982b208f5957158a52b21fbba06ba8141fff2b8c5ce87574"}, "esqlite": {:hex, :esqlite, "0.3.0", "f6c96fae1236fd8da73da904278b820c807aee4f41c7c837c33de1c2edb857fb", [:rebar3], [], "hexpm", "0cce04862887c4a4c39d08e6ab661b2537da099a145aeaab93f06224574b6439"}, - "ex_doc": {:hex, :ex_doc, "0.25.2", "4f1cae793c4d132e06674b282f1d9ea3bf409bcca027ddb2fe177c4eed6a253f", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5b0c172e87ac27f14dfd152d52a145238ec71a95efbf29849550278c58a393d6"}, - "excoveralls": {:hex, :excoveralls, "0.14.2", "f9f5fd0004d7bbeaa28ea9606251bb643c313c3d60710bad1f5809c845b748f0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ca6fd358621cb4d29311b29d4732c4d47dac70e622850979bc54ed9a3e50f3e1"}, + "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, + "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, "extty": {:hex, :extty, "0.2.1", "4da6d78d41f0a9ff9980d82968476b4277ac0afa227d2ed91af0ffcbac2f451b", [:mix], [], "hexpm", "26b2e495c14501d4ae24c7dffba199f6abf0a0f69dcfd07db62f421952442f05"}, "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, @@ -35,6 +35,7 @@ "mimic": {:hex, :mimic, "1.5.1", "085f7ebfeb5b579a13a167aec3c712d71fecfc6cb8b298c0dd3056f97ea2c2a0", [:mix], [], "hexpm", "33a50ef9ff38f8f24b2586d52e529981a3ba2b8d061c872084aff0e993bf4bd5"}, "mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"}, "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, + "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, @@ -48,7 +49,7 @@ "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, "tesla": {:hex, :tesla, "1.4.3", "f5a494e08fb1abe4fd9c28abb17f3d9b62b8f6fc492860baa91efb1aab61c8a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e0755bb664bf4d664af72931f320c97adbf89da4586670f4864bf259b5750386"}, "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, - "tortoise": {:hex, :tortoise, "0.9.9", "2e467570ef1d342d4de8fdc6ba3861f841054ab524080ec3d7052ee07c04501d", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "4a316220b4b443c2497f42702f0c0616af3e4b2cbc6c150ebebb51657a773797"}, + "tortoise": {:hex, :tortoise, "0.10.0", "d8821b9a5052355ca61d9fa784652f435997fa98b210f88565c98f3494605efd", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "926d97b03cd0d2f6e0e1ebf06c1efa50101de96d0317dea5604c1c9e43e66735"}, "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, diff --git a/farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs b/farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs index 30e27e0e2..d12972d55 100644 --- a/farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs +++ b/farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs @@ -3,6 +3,31 @@ defmodule FarmbotExt.MQTTTest do use Mimic alias FarmbotExt.MQTT alias FarmbotExt.MQTT.Support + alias FarmbotExt.MQTT.TopicSupervisor + + test "new_supervisor(opts) - corner case" do + fake_opts = [foo: :bar] + + expect(TopicSupervisor, :start_link, 1, fn opts -> + assert opts == fake_opts + {:ok, self()} + end) + + pid = MQTT.new_supervisor(fake_opts) + assert pid == self() + end + + test "new_supervisor(opts) - edge case" do + fake_opts = [foo: :bar] + + expect(TopicSupervisor, :start_link, 1, fn opts -> + assert opts == fake_opts + {:error, {:already_started, self()}} + end) + + pid = MQTT.new_supervisor(fake_opts) + assert pid == self() + end test "terminate/2" do expect(FarmbotCore.Leds, :blue, fn mode -> diff --git a/farmbot_ext/test/test_helper.exs b/farmbot_ext/test/test_helper.exs index 1bbc750b1..6b7cc8d24 100644 --- a/farmbot_ext/test/test_helper.exs +++ b/farmbot_ext/test/test_helper.exs @@ -4,34 +4,35 @@ Application.ensure_all_started(:mimic) [ Ecto.Changeset, ExTTY, - FarmbotCore.Celery.SysCalls, - FarmbotCore.Celery.SysCalls.Stubs, FarmbotCore.Asset.Command, FarmbotCore.Asset.Private, FarmbotCore.Asset.Repo, FarmbotCore.BotState, FarmbotCore.BotStateNG, + FarmbotCore.Celery.SysCalls, + FarmbotCore.Celery.SysCalls.Stubs, FarmbotCore.Config, FarmbotCore.Leds, FarmbotCore.LogExecutor, FarmbotCore.Logger, FarmbotExt.API, - FarmbotExt.EagerLoader, - FarmbotExt.EagerLoader.Supervisor, FarmbotExt.API.Preloader, FarmbotExt.API.Reconciler, FarmbotExt.API.SyncGroup, FarmbotExt.APIFetcher, FarmbotExt.Bootstrap.Authorization, FarmbotExt.Bootstrap.DropPasswordSupport, - FarmbotTelemetry.HTTP, + FarmbotExt.EagerLoader, + FarmbotExt.EagerLoader.Supervisor, FarmbotExt.MQTT, FarmbotExt.MQTT.LogHandlerSupport, FarmbotExt.MQTT.Support, FarmbotExt.MQTT.SyncHandlerSupport, FarmbotExt.MQTT.TerminalHandlerSupport, + FarmbotExt.MQTT.TopicSupervisor, FarmbotExt.Time, FarmbotTelemetry, + FarmbotTelemetry.HTTP, Tortoise ] |> Enum.map(&Mimic.copy/1) diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index be323ec3c..1ad7ad0e8 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -89,7 +89,7 @@ defmodule FarmbotOS.MixProject do {:cors_plug, "~> 2.0.3", targets: @all_targets}, {:dns, "~> 2.3"}, {:elixir_make, "~> 0.6.2", runtime: false}, - {:ex_doc, "~> 0.25.2", only: [:dev], targets: [:host], runtime: false}, + {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false}, {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, {:farmbot_core, path: "../farmbot_core", env: Mix.env()}, {:farmbot_ext, path: "../farmbot_ext", env: Mix.env()}, @@ -105,7 +105,7 @@ defmodule FarmbotOS.MixProject do targets: :rpi3}, {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, {:luerl, github: "rvirding/luerl", tag: "1.0"}, - {:mdns_lite, "~> 0.7.0", targets: @all_targets}, + {:mdns_lite, "~> 0.8", targets: @all_targets}, {:nerves_firmware_ssh, "~> 0.4.6", targets: @all_targets}, {:nerves_runtime, "~> 0.11.6", targets: @all_targets}, {:nerves_time, "~> 0.4.3", targets: @all_targets}, @@ -118,7 +118,7 @@ defmodule FarmbotOS.MixProject do {:toolshed, "~> 0.2.22", targets: @all_targets}, {:vintage_net_ethernet, "~> 0.10.1", targets: @all_targets}, {:vintage_net_wifi, "~> 0.10.1", targets: @all_targets}, - {:vintage_net, "~> 0.10.2", targets: @all_targets} + {:vintage_net, "~> 0.11", targets: @all_targets} ] end diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock index aa45a8d69..b65296854 100644 --- a/farmbot_os/mix.lock +++ b/farmbot_os/mix.lock @@ -20,13 +20,13 @@ "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "49496d63267bc1a4614ffd5f67c45d9fc3ea62701a6797975bc98bc156d2763f"}, "dns": {:hex, :dns, "2.3.0", "3e750cf3e229898628a091fa7dca29524294db2962d0fc15696ac3a5cfff2315", [:mix], [{:socket, "~> 0.3.13", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm", "f3f1074409b4ecf6f93379a49fb0aef30a898f3093ea22b5c64a85e9f99ca6f8"}, "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "f1e20ddf41713b4db247443a3bea9045c4103b27c0e64b0c21ec50edde51fba8"}, "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "erlex": {:hex, :erlex, "0.2.2", "cb0e6878fdf86dc63509eaf2233a71fa73fc383c8362c8ff8e8b6f0c2bb7017c", [:mix], [], "hexpm", "423a8f6ac70b77f0001c18adbff2b10413afed6901c2975aa33151a9c1263307"}, "esqlite": {:hex, :esqlite, "0.2.5", "cab6d87aeb5f33d848b9bb8a21129e9512ea608f930d4c63576942d8f7d72218", [:rebar3], [], "hexpm", "3dd1163c8807b24a05ec4d88fd0f1bb286a2640ed340898fd792e3a67bb70f10"}, - "ex_doc": {:hex, :ex_doc, "0.25.2", "4f1cae793c4d132e06674b282f1d9ea3bf409bcca027ddb2fe177c4eed6a253f", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "5b0c172e87ac27f14dfd152d52a145238ec71a95efbf29849550278c58a393d6"}, - "excoveralls": {:hex, :excoveralls, "0.14.2", "f9f5fd0004d7bbeaa28ea9606251bb643c313c3d60710bad1f5809c845b748f0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "ca6fd358621cb4d29311b29d4732c4d47dac70e622850979bc54ed9a3e50f3e1"}, + "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, + "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, "extty": {:hex, :extty, "0.2.1", "4da6d78d41f0a9ff9980d82968476b4277ac0afa227d2ed91af0ffcbac2f451b", [:mix], [], "hexpm", "26b2e495c14501d4ae24c7dffba199f6abf0a0f69dcfd07db62f421952442f05"}, "farmbot_system_rpi": {:git, "https://github.com/FarmBot/farmbot_system_rpi.git", "6a6117d8c1dacc1d2f6a4ba1363436f2a4e62ad3", [ref: "v1.16.2-farmbot.1"]}, "farmbot_system_rpi3": {:git, "https://github.com/FarmBot/farmbot_system_rpi3.git", "ae7d4459e3e40d35ec2367554618f8f92d2d3c2e", [tag: "v1.16.2-farmbot.1"]}, @@ -44,7 +44,7 @@ "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "mdns_lite": {:hex, :mdns_lite, "0.7.0", "91da487424d5ba70e13eb44bba67469541cdfe423dfad65be54bca28d8b4217f", [:mix], [{:vintage_net, "~> 0.7", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "b93421ec3919b844793468547a160589a3aad1cdfd4692a1977bc85acd44ab0b"}, + "mdns_lite": {:hex, :mdns_lite, "0.8.3", "41ec5b6532a77737086f83b7ecd0a710bb2fe426221002d9b5ca9f279367a53c", [:mix], [{:vintage_net, "~> 0.7", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "d094a453e7c7c3167ab85257aeb69a7c534d905dfbe0df7b0f98ff2e509aac78"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, @@ -56,7 +56,7 @@ "nerves_hub": {:hex, :nerves_hub, "0.7.4", "0e104cad468c3d601ed423e116ea3422fbd31b7eedb263bcb2a5c489dca8b53b", [:mix], [{:fwup, "~> 0.3.0", [hex: :fwup, repo: "hexpm", optional: false]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:nerves_hub_cli, "~> 0.9", [hex: :nerves_hub_cli, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:phoenix_client, "~> 0.7", [hex: :phoenix_client, repo: "hexpm", optional: false]}, {:websocket_client, "~> 1.3", [hex: :websocket_client, repo: "hexpm", optional: false]}, {:x509, "~> 0.5", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "af1daf7e879f1175c9db1957340b1773f11a00e1c63eb591427d1bf7f3d40b47"}, "nerves_hub_cli": {:hex, :nerves_hub_cli, "0.9.0", "ee02d6a4ce7706b7860df925a5a578c0856757123d7df56dfb38f85818f80aba", [:mix], [{:nerves_hub_user_api, "~> 0.6", [hex: :nerves_hub_user_api, repo: "hexpm", optional: false]}, {:pbcs, "~> 0.1", [hex: :pbcs, repo: "hexpm", optional: false]}, {:table_rex, "~> 2.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}, {:x509, "~> 0.3", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "0d0c2cf36c8e784534d6ba916587cbc282b00d317b577e8b2972eccd5ffe6314"}, "nerves_hub_user_api": {:hex, :nerves_hub_user_api, "0.6.0", "14f7bd249275c647981e6601ebef909fd4036391aef010ff74d01d4799b90bdf", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.1 or ~> 1.3", [hex: :tesla, repo: "hexpm", optional: false]}, {:x509, "~> 0.3", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "de682a5f5302d1f602a92f82fe2380abd658640ca25f620a8e9854e883020ea0"}, - "nerves_runtime": {:hex, :nerves_runtime, "0.11.6", "65c5775ade2f7c5178cdc45a4688ffc6d51d3cf8f7f16563c8074fcdc0f5fb04", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.8.0", [hex: :system_registry, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.1.1 or ~> 0.2.0 or ~> 0.3.0", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm", "6771cd81411f01fde33687209805c6a11854af83b7858b1881976a93415e7f1b"}, + "nerves_runtime": {:hex, :nerves_runtime, "0.11.7", "eb4af57fbae6705d8edf7764173d860aa136d8df1b123f235b0754859e43c1c1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.8.0", [hex: :system_registry, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.1.1 or ~> 0.2.0 or ~> 0.3.0", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm", "68a6f93f4c73b05c0a7dccb6cb6e7624aad3fcbd4a6dfbe27233a1fef572ab65"}, "nerves_system_br": {:hex, :nerves_system_br, "1.16.5", "8355a1d10cbcbb349623394b775acdcd5e874cd6ec9d1e1b0a5380018c29f6d1", [:mix], [], "hexpm", "a5e8dd4a308f09a06f3b1e47cbcec79cb31d0641349bba69437e98a05468896f"}, "nerves_system_linter": {:hex, :nerves_system_linter, "0.3.0", "84e0f63c8ac196b16b77608bbe7df66dcf352845c4e4fb394bffd2b572025413", [:mix], [], "hexpm", "bffbdfb116bc72cde6e408c34c0670b199846e9a8f0953cc1c9f1eea693821a1"}, "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, @@ -90,16 +90,16 @@ "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, "tesla": {:hex, :tesla, "1.4.3", "f5a494e08fb1abe4fd9c28abb17f3d9b62b8f6fc492860baa91efb1aab61c8a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e0755bb664bf4d664af72931f320c97adbf89da4586670f4864bf259b5750386"}, "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, - "toolshed": {:hex, :toolshed, "0.2.22", "f2f7bef8ae4f3dd8f43c7bc9d8ac2d8263d74cb3db593250aaf047ec9345e72f", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: true]}], "hexpm", "59d1dad19235ec9eed50e717733be5329cab7be9b78d8d0e83058b4fe8faec4f"}, - "tortoise": {:hex, :tortoise, "0.9.9", "2e467570ef1d342d4de8fdc6ba3861f841054ab524080ec3d7052ee07c04501d", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "4a316220b4b443c2497f42702f0c0616af3e4b2cbc6c150ebebb51657a773797"}, + "toolshed": {:hex, :toolshed, "0.2.24", "9df521cd565fd921dbfcd9668f4a1378efeb33a834743a287f4a7f9c9f01baa0", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: true]}], "hexpm", "c80de2c3a2ddeada0f709938607a1d3a136242168ea6638a12cf09445c8cf2f6"}, + "tortoise": {:hex, :tortoise, "0.10.0", "d8821b9a5052355ca61d9fa784652f435997fa98b210f88565c98f3494605efd", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "926d97b03cd0d2f6e0e1ebf06c1efa50101de96d0317dea5604c1c9e43e66735"}, "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, "uboot_env": {:hex, :uboot_env, "0.3.0", "8afbcc8e5b65e5d0d5660ded2f5835a959d2326fa8683183f380cd6464e75174", [:mix], [], "hexpm", "d8fe5d2b4d52a14398ace02bd604ff7a0fa8960550bb7254f75dcbd438ddc6a1"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, - "vintage_net": {:hex, :vintage_net, "0.10.5", "0441e5c76338ca071c97503390fcfc484c2f352b7573453e8da1255e65345c96", [:make, :mix], [{:beam_notify, "~> 0.2.0", [hex: :beam_notify, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0 or ~> 2.1.0 or ~> 3.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.1 or ~> 0.6.0", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "69b599dff8e018d562a7dbdb1c192b663aad6ae7ced5690b3c0a1337f9f1f65c"}, + "vintage_net": {:hex, :vintage_net, "0.11.1", "3bf5696c863c83dea7b6c245ca5b4cf4408961d06f6cbdeff271128c985db9f1", [:make, :mix], [{:beam_notify, "~> 0.2.0", [hex: :beam_notify, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0 or ~> 2.1.0 or ~> 3.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.1 or ~> 0.6.0", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "4d56f40a821098a4e734cf8e3de57ef7b4a04723ff105e3561a48baa9b2f138e"}, "vintage_net_direct": {:hex, :vintage_net_direct, "0.9.0", "fbb61973dd0ea39029557a89be9dffca7801a0817dc4a181d129325a0fe6be93", [:mix], [{:one_dhcpd, "~> 0.2.3", [hex: :one_dhcpd, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.9.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "d00537f179f177b46ccde29f7461566c49c094fa02c19691b866afa643052b92"}, - "vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.10.2", "7af44e5db1a536238061358bb3111f65e6b80157100016b34012ce68d2b34031", [:mix], [{:vintage_net, "~> 0.10.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "f80d3f8a80cebcf2f2091f46fb8f3f0dee1aea7f4e94890c19cfc512e26e496f"}, - "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.10.4", "9405a063f3602802cb7179d90377d58c88e8b1bcb92a7844c8662a937b3427bf", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.10.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "8b0373f1a0c1e3f93530c0bb4c8c88afb1a34c750f2482c9d0339a3b19d18b4e"}, + "vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.10.3", "5325c590459544f871b0a807061fa37c3833ed8f83b94b0a15d497177503d5c2", [:mix], [{:vintage_net, "~> 0.10.0 or ~> 0.11.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "4ec1ae7b2188829e493f54e0ba9e36ea53e8c95aecdf5950011ce4f13fe4ed52"}, + "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.10.6", "f5509f7c455ee5f4bc52174ada4d8eaf6e6e597f9d5ba51f17ffed613c0e0a8a", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.10.0 or ~> 0.11.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "2d94acb727ba5982e1c17b50cb08594d644f8da7bd8f9a56c68d2de972319080"}, "websocket_client": {:hex, :websocket_client, "1.3.0", "2275d7daaa1cdacebf2068891c9844b15f4fdc3de3ec2602420c2fb486db59b6", [:rebar3], [], "hexpm", "b864fa076f059b615da4ab99240e515b26132ce4d2d0f9df5d7f22f01fa04b65"}, "x509": {:hex, :x509, "0.8.0", "b286b9dbb32801f76f48bdea476304d280c64ce172ea330c23d8df7ea9e75ce6", [:mix], [], "hexpm", "8aafaafdcafb1ea9f06bfc32c3b03ccc66f087e0faf36ef94c0195bb7a04157e"}, } diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs index f9351609f..4a06eb836 100644 --- a/farmbot_telemetry/mix.exs +++ b/farmbot_telemetry/mix.exs @@ -57,7 +57,7 @@ defmodule FarmbotTelemetry.MixProject do {:telemetry, "~> 1.0.0"}, {:uuid, "~> 1.1.8"}, {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, - {:ex_doc, "~> 0.25.2", only: [:dev], targets: [:host], runtime: false} + {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false} ] end end diff --git a/mix.exs b/mix.exs index fcf6b461a..ff0fa904b 100644 --- a/mix.exs +++ b/mix.exs @@ -43,7 +43,7 @@ defmodule FarmbotSupport.MixProject do [ {:jason, "~> 1.2.2"}, {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, - {:ex_doc, "~> 0.25.2", only: [:dev], targets: [:host], runtime: false} + {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false} ] end end From 750b759c9300f7c0abd28ac167b3de9b331e4613 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Sat, 9 Oct 2021 10:50:33 -0500 Subject: [PATCH 09/15] v14.5.0 RC4 Public Beta (#1410) * v14.5.0-RC4 Beta --- CHANGELOG.md | 2 ++ VERSION | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e69b99fd..8435a8343 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * SSL/HTTPS configuration updates. * Upgrade numerouse deps, such as Lua runtime and Certifi. + * Fix issue where FarmEvents would fail to execute near boot time on Express models. + * Performance updates to firmware handler. # 14.4.1 diff --git a/VERSION b/VERSION index e2e6ee22f..2085ef5c0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.5.0-rc3 +14.5.0-rc4 From 40cb5b32fcb9db0a8359b751899cb7fd0d4efb31 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 13 Oct 2021 09:58:26 -0500 Subject: [PATCH 10/15] Follow up to recent PR by Jsimmonds2 (#1412) * Amend missing code in `sequence_event.ex` and allow NervesTime access from farmbot_core * Test updates, CC: @jsimmonds2 Co-authored-by: John Simmonds --- .../farm_event_worker/sequence_event.ex | 42 ++++++++++++------- farmbot_core/mix.exs | 2 +- .../farm_event_worker/sequence_event_test.exs | 35 +++++++++++++++- farmbot_core/test/test_helper.exs | 1 + farmbot_os/mix.exs | 2 +- 5 files changed, 63 insertions(+), 19 deletions(-) diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex index 2529771a7..3b675bdfa 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex +++ b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex @@ -1,13 +1,18 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do require Logger require FarmbotCore.Logger - alias FarmbotCore.Celery.AST alias FarmbotCore.{ Asset, - Asset.FarmEvent + Asset.FarmEvent, + Celery, + Celery.AST } use GenServer + # Allow 'catchup' executions for ocurrences due in the past 15 minutes + # This matches Celery.Scheduler setting + @grace_period_s 900 + @impl GenServer def init([farm_event, args]) do send self(), :schedule @@ -16,20 +21,25 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do @impl GenServer def handle_info(:schedule, state) do - farm_event = state.farm_event + unless NervesTime.synchronized? do + {:noreply, %{state | timesync_waits: state.timesync_waits + 1}, 3_000} + else + base_time = DateTime.add(DateTime.utc_now(), 0 - @grace_period_s) + farm_event = state.farm_event - occurrences = - farm_event - |> FarmEvent.build_calendar(DateTime.utc_now()) - # get rid of any item that has already been scheduled/executed - |> Enum.reject(fn(scheduled_at) -> - Asset.get_farm_event_execution(farm_event, scheduled_at) + occurrences = + farm_event + |> FarmEvent.build_calendar(base_time) + # get rid of any item that has already been scheduled/executed + |> Enum.reject(fn(scheduled_at) -> + Asset.get_farm_event_execution(farm_event, scheduled_at) + end) + occurrences + |> Enum.each(fn(at) -> + schedule_sequence(farm_event, at) end) - occurrences - |> Enum.each(fn(at) -> - schedule_sequence(farm_event, at) - end) - {:noreply, %{state | scheduled: state.scheduled + length(occurrences)}} + {:noreply, %{state | scheduled: state.scheduled + length(occurrences)}} + end end def handle_info(:timeout, state) do @@ -37,7 +47,7 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do {:noreply, state} end - def handle_info({FarmbotCore.Celery, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do + def handle_info({Celery, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do status = case result do :ok -> "ok" {:error, reason} -> @@ -63,6 +73,6 @@ defmodule FarmbotCore.FarmEventWorker.SequenceEvent do |> Map.put(:locals, %{celery_ast.args.locals | body: celery_ast.args.locals.body ++ param_appls}) celery_ast = %{celery_ast | args: celery_args} - FarmbotCore.Celery.schedule(celery_ast, at, farm_event) + Celery.schedule(celery_ast, at, farm_event) end end diff --git a/farmbot_core/mix.exs b/farmbot_core/mix.exs index 9246e0199..69257fef2 100644 --- a/farmbot_core/mix.exs +++ b/farmbot_core/mix.exs @@ -65,7 +65,7 @@ defmodule FarmbotCore.MixProject do {:jason, "~> 1.2"}, {:mimic, "~> 1.5", only: :test}, {:muontrap, "~> 0.6"}, - {:nerves_time, "~> 0.4.3", targets: [:rpi, :rpi3]}, + {:nerves_time, "~> 0.4.3"}, {:sqlite_ecto2, "2.3.1"}, {:timex, "~> 3.7"} ] diff --git a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs b/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs index 903835bbd..a210d2992 100644 --- a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs +++ b/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs @@ -11,7 +11,7 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do assert_receive :schedule, 1000 end - test "handle_info(:schedule, state)" do + test "handle_info(:schedule, state) - Synchronized" do state = %{ args: [], farm_event: %FarmbotCore.Asset.FarmEvent{ @@ -33,6 +33,10 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do timesync_waits: 0 } + expect(NervesTime, :synchronized?, 1, fn -> + true + end) + expect(FarmbotCore.Celery, :schedule, 25, fn celery_ast, _at, farm_event -> assert %FarmbotCore.Celery.AST{} = celery_ast assert state.farm_event.id == farm_event.id @@ -57,4 +61,33 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do assert state2.scheduled == 50 assert state2.timesync_waits == 0 end + + test "handle_info(:schedule, state) - Not synchronized" do + state = %{ + args: [], + farm_event: %FarmbotCore.Asset.FarmEvent{ + body: [], + created_at: ~U[2021-10-08 21:28:19.200000Z], + end_time: ~U[2051-10-09 22:30:00.000000Z], + executable_id: 2, + executable_type: "Sequence", + executions: [], + id: 1, + last_executed: nil, + local_id: "6fae5451-baa8-4368-9612-cfd571384814", + repeat: 1, + start_time: ~U[2051-10-08 21:30:00.000000Z], + time_unit: "hourly", + updated_at: ~U[2051-10-08 21:28:19.294000Z] + }, + scheduled: 25, + timesync_waits: 0 + } + + {:noreply, state2, timeout} = SequenceEvent.handle_info(:schedule, state) + assert timeout == 3000 + assert state2.farm_event.local_id == state2.farm_event.local_id + assert state2.scheduled == 25 + assert state2.timesync_waits == 1 + end end diff --git a/farmbot_core/test/test_helper.exs b/farmbot_core/test/test_helper.exs index f414893cb..c3bd6ccef 100644 --- a/farmbot_core/test/test_helper.exs +++ b/farmbot_core/test/test_helper.exs @@ -28,6 +28,7 @@ FarmbotCore.Asset.Device.changeset(FarmbotCore.Asset.device(), %{timezone: tz}) FarmbotCore.FirmwareEstopTimer, FarmbotCore.LogExecutor, MuonTrap, + NervesTime, Timex ] |> Enum.map(&Mimic.copy/1) diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs index 1ad7ad0e8..889940bb3 100644 --- a/farmbot_os/mix.exs +++ b/farmbot_os/mix.exs @@ -108,7 +108,7 @@ defmodule FarmbotOS.MixProject do {:mdns_lite, "~> 0.8", targets: @all_targets}, {:nerves_firmware_ssh, "~> 0.4.6", targets: @all_targets}, {:nerves_runtime, "~> 0.11.6", targets: @all_targets}, - {:nerves_time, "~> 0.4.3", targets: @all_targets}, + {:nerves_time, "~> 0.4.3"}, {:nerves, "~> 1.7.11", runtime: false}, {:phoenix_html, "~> 2.14.3"}, {:plug_cowboy, "~> 2.5.2"}, From 864329f8e0f4b03f428201584ac837e4f31481a0 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Tue, 26 Oct 2021 12:56:51 -0500 Subject: [PATCH 11/15] Upgrade database, revert application to monolith architecture. (#1415) * Convert app to monolithic architecture. * Upgrade/replace database driver. --- .circleci/config.yml | 188 +--------- .circleci/setup-arduino.sh | 9 - .formatter.exs | 10 +- .gitignore | 96 +++--- CHANGELOG.md | 5 + Makefile | 60 ---- VERSION | 2 +- config/config.exs | 54 +++ config/dev.exs | 11 + config/target.exs | 68 ++++ config/test.exs | 29 ++ farmbot_os/coveralls.json => coveralls.json | 0 docs/celery_script/celery_script.md | 79 ----- docs/glossary.md | 49 --- docs/index.md | 61 ---- docs/project/farmbot_core.md | 60 ---- docs/project/farmbot_ext.md | 47 --- docs/project/farmbot_os.md | 52 --- docs/project/farmbot_telemetry.md | 9 - docs/project/structure.md | 55 --- .../building_target_firmware.md | 128 ------- .../consoles/erlang_distribution.md | 38 -- docs/target_development/consoles/ssh.md | 27 -- .../consoles/target_console.md | 45 --- docs/target_development/consoles/uart.md | 33 -- .../releasing_target_firmware.md | 95 ----- docs/target_development/target_faq.md | 42 --- farmbot_core/.formatter.exs | 19 - farmbot_core/.gitignore | 27 -- farmbot_core/.tool-versions | 1 - farmbot_core/config/config.exs | 61 ---- farmbot_core/config/dev.exs | 4 - farmbot_core/config/test.exs | 21 -- farmbot_core/coveralls.json | 9 - .../fixtures/farmware/test-farmware/run.py | 1 - farmbot_core/lib/farmbot_core.ex | 32 -- .../lib/farmbot_core/asset/regimen/item.ex | 30 -- .../lib/farmbot_core/asset/supervisor.ex | 48 --- .../farm_event_worker/sequence_event.ex | 78 ----- .../lib/farmbot_core/bot_state/supervisor.ex | 21 -- .../config_storage/migration_helpers.ex | 62 ---- .../lib/farmbot_core/config_storage/repo.ex | 5 - .../farmbot_core/config_storage/supervisor.ex | 18 - .../lib/farmbot_core/ecto_migrator.ex | 73 ---- farmbot_core/lib/farmbot_core/leds/leds.ex | 28 -- .../lib/farmbot_core/log_storage/repo.ex | 6 - .../farmbot_core/log_storage/supervisor.ex | 13 - .../lib/farmbot_core/storage_supervisor.ex | 26 -- farmbot_core/mix.exs | 92 ----- farmbot_core/mix.lock | 51 --- ...0181017210730_create_local_metas_table.exs | 14 - .../20181017210735_create_devices_table.exs | 14 - .../20181017223659_create_tools_table.exs | 13 - ...0181017225445_create_peripherals_table.exs | 15 - .../20181017230326_create_sensors_table.exs | 15 - ...017230333_create_sensor_readings_table.exs | 18 - .../20181018005030_create_sequences_table.exs | 16 - .../20181018022229_create_regimens_table.exs | 14 - ...181018040229_create_pin_bindings_table.exs | 15 - .../20181019165701_create_points_table.exs | 22 -- ...0181019172740_create_farm_events_table.exs | 19 - ...19180739_create_firmware_configs_table.exs | 100 ------ ...181019180816_create_fbos_configs_table.exs | 26 -- ...11_create_farmware_installations_table.exs | 14 - ...81019180925_create_farmware_envs_table.exs | 14 - ...19180955_create_diagnostic_dumps_table.exs | 19 - ...181019181000_create_device_certs_table.exs | 13 - .../20181022002449_create_syncs_table.exs | 27 -- ...02450_create_persistent_regimens_table.exs | 37 -- ...0181022002455_create_id_unique_indexes.exs | 21 -- .../20190319162822_add_alerts_table.exs | 15 - .../20190326184305_add_body_to_regimen.exs | 10 - ...rsistent_regimens_to_regimen_instances.exs | 7 - .../20190327192248_add_body_to_farmevents.exs | 10 - ...4139_add_update_channel_to_fbos_config.exs | 9 - ...stance_and_farm_event_execution_tables.exs | 33 -- ...05162506_add_api_migrated_to_fw_config.exs | 9 - ...0190724183349_create_public_keys_table.exs | 20 -- ...0644_create_first_party_farmware_table.exs | 20 -- ...918171439_add_ota_update_fields_device.exs | 10 - ...190923214317_create_point_groups_table.exs | 22 -- .../20190924174628_add_firmware_params.exs | 14 - .../20190926161914_add_point_discarded_at.exs | 9 - .../20190926165507_force_resync_points.exs | 9 - ...20190930204239_add_point_group_sort_by.exs | 9 - .../20191108163819_add_ota_log_to_device.exs | 9 - .../20191108163850_force_resync_device.exs | 7 - ...23_add_mounted_tool_id_to_device_table.exs | 9 - ...orce_resync_device_for_mounted_tool_id.exs | 7 - .../20191212210054_resync_firmware_config.exs | 16 - ...191219192107_add_needs_reset_to_device.exs | 12 - ...200219001135_add_gantry_mounted_fields.exs | 12 - ...invalidate_local_points_gantry_mounted.exs | 7 - ...0221204400_add_criteria_to_point_group.exs | 13 - ...00224204400_add_openfarm_slug_to_point.exs | 11 - ...1204400_add_pullout_direction_to_point.exs | 12 - .../20200907153510_param_movement_spd_z2.exs | 11 - ...0930210054_add_soil_height_safe_height.exs | 15 - ...510182200_add_calibration_retry_fields.exs | 16 - ...0511182200_calibration_retry_field_fix.exs | 10 - ...20210514182200_add_stealth_chop_fields.exs | 19 - .../20210514182201_stealth_chop_field_fix.exs | 10 - ...210914210730_add_device_location_attrs.exs | 14 - .../20170922202022_add_eav_tables.exs | 40 --- .../migrations/20170922221449_seed_groups.exs | 326 ------------------ .../20171025231226_add_farmware_table.exs | 12 - .../20171114135840_add_sync_cmd_table.exs | 12 - .../20171130004447_add_gpio_registry.exs | 10 - ...71130024651_add_factory_reset_settings.exs | 9 - ...44049_add_sequence_complete_log_option.exs | 11 - .../20171208041623_arduino_debug_param.exs | 9 - .../20171208205940_add_firmware_io_log.exs | 24 -- .../20171227200214_add_amqp_bootup_log.exs | 9 - .../20180103212728_add_beta_chanel_config.exs | 10 - ...020301_add_special_fw_migration_config.exs | 9 - .../20180122161013_add_api_migrated_flag.exs | 9 - .../20180123173929_email_on_estop.exs | 9 - ...1932_add_network_interface_deprication.exs | 9 - .../20180213164114_ignore_fbos_config.exs | 9 - ...180226174206_network_unique_constraint.exs | 7 - ...180307180141_firmware_initialized_flag.exs | 9 - ...08162327_add_maybe_hidden_network_flag.exs | 9 - ...03180047_add_regimen_persistence_table.exs | 12 - .../20180403180213_add_sync_timeout.exs | 8 - ...20180409142944_param_invert_endstops_2.exs | 10 - .../20180411201055_add regimen indexes.exs | 15 - .../20180416165217_add_beta_state.exs | 21 -- ...27142609_add_advanced_network_settings.exs | 13 - .../20180627122653_add_secret_field.exs | 8 - ...20180702143518_add_ntp_and_dns_configs.exs | 43 --- .../20180724200909_migrate_secret.exs | 49 --- .../20180802155935_neets_http_sync.exs | 8 - .../20180813200950_add_ssh_opts.exs | 10 - .../20180814180226_add_farmware_migration.exs | 10 - .../20180814202716_add_ignore_fw_config.exs | 8 - .../20181203195326_migrate_settings.exs | 40 --- ...81204173345_add_firmware_flash_setting.exs | 8 - ...11191350_add_network_regulatory_domain.exs | 9 - .../20190110180643_add_eap_settings.exs | 10 - ...0190208211728_add_update_channel_field.exs | 8 - ...705203806_add_firmware_needs_open_flag.exs | 8 - ...20191022175032_set_firmware_flash_true.exs | 21 -- farmbot_core/priv/easter_eggs.json | 37 -- .../20180620135642_add_log_buffer.exs | 22 -- ...1221214_add_message_hash_to_logs_table.exs | 10 - farmbot_core/test/firmware/avr_dude_test.exs | 70 ---- farmbot_core/test/test_helper.exs | 37 -- farmbot_ext/.formatter.exs | 5 - farmbot_ext/.gitignore | 26 -- farmbot_ext/.tool-versions | 1 - farmbot_ext/config/config.exs | 75 ---- farmbot_ext/coveralls.json | 6 - farmbot_ext/lib/farmbot_ext.ex | 16 - farmbot_ext/mix.exs | 54 --- farmbot_ext/mix.lock | 56 --- farmbot_ext/test/farmbot_ext/http_test.exs | 9 - farmbot_ext/test/test_helper.exs | 103 ------ farmbot_ext/vendor/rsa.ex | 18 - farmbot_os/.formatter.exs | 11 - farmbot_os/.gitignore | 22 -- farmbot_os/.tool-versions | 1 - farmbot_os/Makefile | 50 --- farmbot_os/config/config.exs | 91 ----- farmbot_os/config/host/dev.exs | 40 --- farmbot_os/config/host/test.exs | 40 --- farmbot_os/config/target/dev.exs | 101 ------ farmbot_os/config/target/prod.exs | 104 ------ farmbot_os/config/target/rpi.exs | 6 - farmbot_os/config/target/rpi3.exs | 6 - farmbot_os/lib/farmbot_os.ex | 19 - farmbot_os/lib/farmbot_os/easter_eggs.ex | 60 ---- farmbot_os/mix.exs | 136 -------- farmbot_os/mix.lock | 105 ------ farmbot_os/priv/easter_eggs.json | 32 -- farmbot_os/test/easter_eggs_test.exs | 12 - farmbot_os/test/test_helper.exs | 40 --- farmbot_telemetry/.formatter.exs | 5 - farmbot_telemetry/.gitignore | 24 -- farmbot_telemetry/README.md | 21 -- farmbot_telemetry/coveralls.json | 6 - farmbot_telemetry/mix.exs | 63 ---- farmbot_telemetry/mix.lock | 23 -- farmbot_telemetry/test/test_helper.exs | 2 - .../fixture => fixtures}/corpus.json | 0 .../fixture => fixtures}/every_sequence.json | 0 .../farmware/test-farmware/manifest.json | 0 .../fixture => fixtures}/inner_sequence.json | 0 .../fixture => fixtures}/outer_sequence.json | 0 .../paramater_sequence.json | 0 .../point_group_sequence.json | 0 .../regimens/regimen_with_variables.json | 0 .../fixture => fixtures}/sequence_pair.json | 0 .../fixture => fixtures}/unbound.json | 0 .../fixture => fixtures}/unbound_var_x.json | 0 {farmbot_os/lib => lib}/avrdude.ex | 0 {farmbot_core/lib => lib}/celery.ex | 5 +- {farmbot_core/lib => lib}/celery/ast.ex | 0 .../lib => lib}/celery/ast/factory.ex | 0 {farmbot_core/lib => lib}/celery/compiler.ex | 38 +- .../lib => lib}/celery/compiler/utils.ex | 38 +- .../celery/compilers/assertion_compiler.ex | 19 +- .../celery/compilers/axis_control_compiler.ex | 133 +++---- .../celery/compilers/data_control_compiler.ex | 8 +- .../celery/compilers/execute_compiler.ex | 4 +- .../celery/compilers/farmware_compiler.ex | 14 +- .../celery/compilers/if_compiler.ex | 30 +- .../lib => lib}/celery/compilers/lua.ex | 15 +- .../celery/compilers/move_compiler.ex | 62 ++-- .../celery/compilers/pin_control_compiler.ex | 31 +- .../celery/compilers/rpc_request_compiler.ex | 6 +- .../lib => lib}/celery/compilers/scope.ex | 38 +- .../celery/compilers/sequence_compiler.ex | 16 +- .../compilers/update_resource_compiler.ex | 13 +- .../celery/compilers/variable_transformer.ex | 11 +- {farmbot_core/lib => lib}/celery/corpus.ex | 10 +- .../lib => lib}/celery/corpus/arg.ex | 0 .../lib => lib}/celery/corpus/node.ex | 0 {farmbot_core/lib => lib}/celery/dot_props.ex | 0 .../lib => lib}/celery/format_util.ex | 0 .../lib => lib}/celery/interpolation.ex | 31 +- .../lib => lib}/celery/runtime_error.ex | 0 {farmbot_core/lib => lib}/celery/scheduler.ex | 3 +- .../lib => lib}/celery/special_value.ex | 21 +- .../lib => lib}/celery/step_runner.ex | 11 +- .../celery/sys_call_glue.ex | 6 +- .../lib => lib}/celery/sys_calls/stubs.ex | 4 +- .../lib/farmbot_core => lib/core}/asset.ex | 116 +++++-- .../core}/asset/box_led.ex | 0 .../core}/asset/command.ex | 0 .../core}/asset/criteria_retriever.ex | 135 ++++---- .../farmbot_core => lib/core}/asset/device.ex | 2 +- .../core}/asset/farm_event.ex | 29 +- .../core}/asset/farm_event/body_node.ex | 2 +- .../core}/asset/farm_event/execution.ex | 13 +- .../core}/asset/farmware_env.ex | 0 .../core}/asset/farmware_installation.ex | 5 +- .../asset/farmware_installation/manifest.ex | 45 ++- .../core}/asset/fbos_config.ex | 4 +- .../core}/asset/firmware_config.ex | 50 ++- .../core}/asset/first_party_farmware.ex | 0 .../core}/asset/peripheral.ex | 10 +- .../core}/asset/pin_binding.ex | 37 +- .../farmbot_core => lib/core}/asset/point.ex | 6 +- .../core}/asset/point_group.ex | 4 +- .../core}/asset/private.ex | 83 +++-- .../core}/asset/private/local_meta.ex | 0 .../core}/asset/public_key.ex | 12 +- .../core}/asset/regimen.ex | 0 .../core}/asset/regimen/body_node.ex | 8 +- lib/core/asset/regimen/item.ex | 28 ++ .../core}/asset/regimen_instance.ex | 34 +- .../core}/asset/regimen_instance/execution.ex | 13 +- .../farmbot_core => lib/core}/asset/repo.ex | 2 +- .../farmbot_core => lib/core}/asset/schema.ex | 2 +- .../farmbot_core => lib/core}/asset/sensor.ex | 10 +- .../core}/asset/sensor_reading.ex | 13 +- .../core}/asset/sequence.ex | 11 +- .../core}/asset/storage_auth.ex | 12 +- lib/core/asset/supervisor.ex | 44 +++ .../farmbot_core => lib/core}/asset/sync.ex | 10 +- .../farmbot_core => lib/core}/asset/tool.ex | 0 .../farmbot_core => lib/core}/asset/view.ex | 0 .../core}/asset_monitor.ex | 24 +- .../farmbot_core => lib/core}/asset_worker.ex | 0 .../core}/asset_workers/device_worker.ex | 21 +- .../core}/asset_workers/farm_event_worker.ex | 1 + .../farm_event_worker/regimen_event.ex | 53 ++- .../farm_event_worker/sequence_event.ex | 92 +++++ .../asset_workers/farmware_env_worker.ex | 0 .../farmware_installation_worker.ex | 97 ++++-- .../core}/asset_workers/fbos_config_worker.ex | 75 +++- .../asset_workers/firmware_config_worker.ex | 0 .../first_party_farmware_worker.ex | 2 +- .../core}/asset_workers/peripheral_worker.ex | 41 ++- .../core}/asset_workers/pin_binding_worker.ex | 82 +++-- .../pin_binding_worker/stub_gpio_handler.ex | 1 - .../core}/asset_workers/public_key_worker.ex | 6 +- .../public_key_worker/stub_ssh_handler.ex | 2 +- .../asset_workers/regimen_instance_worker.ex | 79 +++-- .../farmbot_core => lib/core}/bot_state.ex | 35 +- .../core}/bot_state/filesystem.ex | 36 +- .../core}/bot_state/job_progress.ex | 17 +- .../bot_state/scheduler_usage_reporter.ex | 4 +- lib/core/bot_state/supervisor.ex | 18 + .../farmbot_core => lib/core}/bot_state_ng.ex | 19 +- .../core}/bot_state_ng/configuration.ex | 0 .../bot_state_ng/informational_settings.ex | 2 +- .../core}/bot_state_ng/location_data.ex | 0 .../core}/bot_state_ng/location_data/vec3.ex | 0 .../bot_state_ng/location_data/vec3_string.ex | 2 +- .../core}/bot_state_ng/mcu_params.ex | 224 ++++++------ .../lib/farmbot_core => lib/core}/calendar.ex | 0 .../core/change_supervisor.ex | 7 +- .../core}/config_storage/bool_value.ex | 0 .../core}/config_storage/config.ex | 0 .../core}/config_storage/config_storage.ex | 45 ++- .../core}/config_storage/float_value.ex | 0 .../core}/config_storage/group.ex | 0 .../core}/config_storage/network_interface.ex | 31 +- .../core}/config_storage/string_value.ex | 0 .../core}/farmware_runtime.ex | 51 ++- .../core}/farmware_runtime/pipe_worker.ex | 78 +++-- .../core}/firmware_estop_timer.ex | 9 +- .../lib/farmbot_core => lib/core}/json.ex | 4 +- .../core}/json/jason_parser.ex | 0 .../farmbot_core => lib/core}/json/parser.ex | 0 .../core}/leds/led_handler.ex | 0 lib/core/leds/leds.ex | 42 +++ .../core}/leds/stub_handler.ex | 0 .../core}/log_storage/log.ex | 37 +- .../core}/log_storage/log_executor.ex | 1 + .../core}/log_storage/logger.ex | 80 ++--- .../lib/farmbot_core => lib/core}/project.ex | 11 +- .../farmbot_core => lib/core}/time_utils.ex | 0 .../lib/farmbot_ext => lib/ext}/api.ex | 0 .../ext}/api/image_uploader.ex | 4 +- .../lib/farmbot_ext => lib/ext}/api/ping.ex | 0 .../farmbot_ext => lib/ext}/api/preloader.ex | 6 +- .../farmbot_ext => lib/ext}/api/reconciler.ex | 18 +- .../farmbot_ext => lib/ext}/api/sync_group.ex | 3 +- .../lib/farmbot_ext => lib/ext}/api/view.ex | 0 .../farmbot_ext => lib/ext}/api_adapter.ex | 0 .../farmbot_ext => lib/ext}/api_fetcher.ex | 44 ++- .../lib/farmbot_ext => lib/ext}/bootstrap.ex | 15 +- .../ext}/bootstrap/authorization.ex | 43 ++- .../ext}/bootstrap/drop_password_support.ex | 0 .../ext}/bootstrap/drop_password_task.ex | 0 .../ext}/bootstrap/supervisor.ex | 2 +- .../farmbot_ext => lib/ext}/dirty_worker.ex | 2 +- .../ext}/dirty_worker/supervisor.ex | 2 +- .../farmbot_ext => lib/ext}/eager_loader.ex | 15 +- .../ext}/eager_loader/supervisor.ex | 5 +- .../lib/farmbot_ext => lib/ext}/jwt.ex | 0 .../ext}/mqtt/bot_state_handler.ex | 0 .../ext}/mqtt/log_handler.ex | 2 +- .../ext}/mqtt/log_handler_support.ex | 3 +- .../lib/farmbot_ext => lib/ext}/mqtt/mqtt.ex | 0 .../ext}/mqtt/ping_handler.ex | 0 .../ext}/mqtt/rpc_handler.ex | 0 .../ext}/mqtt/supervisor.ex | 2 +- .../farmbot_ext => lib/ext}/mqtt/support.ex | 0 .../ext}/mqtt/sync_handler.ex | 0 .../ext}/mqtt/sync_handler_support.ex | 6 +- .../ext}/mqtt/telemetry_handler.ex | 16 +- .../ext}/mqtt/terminal_handler.ex | 0 .../ext}/mqtt/terminal_handler_support.ex | 0 .../ext}/mqtt/topic_supervisor.ex | 0 .../lib/farmbot_ext => lib/ext}/time.ex | 2 +- lib/farmbot_os.ex | 31 ++ .../lib => lib}/farmbot_telemetry.ex | 73 ++-- {farmbot_core/lib => lib}/firmware/avrdude.ex | 0 {farmbot_core/lib => lib}/firmware/command.ex | 0 .../lib => lib}/firmware/config_uploader.ex | 0 .../lib => lib}/firmware/error_detector.ex | 0 {farmbot_core/lib => lib}/firmware/flash.ex | 0 .../lib => lib}/firmware/flash_utils.ex | 2 +- .../lib => lib}/firmware/floating_point.ex | 0 {farmbot_core/lib => lib}/firmware/gcode.ex | 0 .../lib => lib}/firmware/gcode_decoder.ex | 7 +- .../firmware/inbound_side_effects.ex | 0 .../lib => lib}/firmware/lua_uart.ex | 0 .../lib => lib}/firmware/parameter.ex | 0 {farmbot_core/lib => lib}/firmware/request.ex | 0 .../lib => lib}/firmware/resetter.ex | 0 .../lib => lib}/firmware/rx_buffer.ex | 0 .../lib => lib}/firmware/tx_buffer.ex | 0 .../lib => lib}/firmware/uart_core.ex | 0 .../lib => lib}/firmware/uart_core_support.ex | 0 .../lib => lib}/firmware/uart_detector.ex | 0 .../lib => lib}/firmware/uart_observer.ex | 0 .../os}/configurator/config_data_layer.ex | 0 .../os}/configurator/data_layer.ex | 0 .../os}/configurator/dets_telemetry_layer.ex | 0 .../os}/configurator/fake_network_layer.ex | 0 .../os}/configurator/logger_backend.ex | 0 .../os}/configurator/logger_socket.ex | 0 .../os}/configurator/network_layer.ex | 0 .../os}/configurator/router.ex | 0 .../os}/configurator/supervisor.ex | 0 .../os}/configurator/telemetry_layer.ex | 0 .../lib/farmbot_os => lib/os}/filesystem.ex | 0 .../farmbot_os => lib/os}/init/fs_checkup.ex | 0 .../farmbot_os => lib/os}/init/supervisor.ex | 0 lib/os/legacy_migrator.ex | 100 ++++++ {farmbot_os/lib/farmbot_os => lib/os}/lua.ex | 8 +- .../os}/lua/data_manipulation.ex | 2 +- .../lib/farmbot_os => lib/os}/lua/firmware.ex | 50 +-- .../lib/farmbot_os => lib/os}/lua/info.ex | 4 +- .../lib/farmbot_os => lib/os}/lua/util.ex | 0 .../lib/farmbot_os => lib/os}/lua/wait.ex | 6 +- lib/os/migrator.ex | 22 ++ .../os}/platform_supervisor.ex | 0 .../lib/farmbot_os => lib/os}/sys_calls.ex | 6 +- .../os}/sys_calls/change_ownership.ex | 3 +- .../os}/sys_calls/check_update.ex | 2 +- .../os}/sys_calls/factory_reset.ex | 0 .../os}/sys_calls/farmware.ex | 4 +- .../os}/sys_calls/movement.ex | 0 .../os}/sys_calls/pin_control.ex | 0 .../os}/sys_calls/point_lookup.ex | 0 .../os}/sys_calls/resource_update.ex | 0 .../os}/sys_calls/send_message.ex | 2 +- .../os}/sys_calls/set_pin_io_mode.ex | 0 .../lib/farmbot_os => lib/os}/system.ex | 16 +- .../farmbot_os => lib/os}/update_progress.ex | 0 .../farmbot_os => lib/os}/update_support.ex | 6 +- .../telemetry}/application.ex | 4 +- .../telemetry}/http.ex | 2 +- mix.exs | 166 +++++++-- mix.lock | 101 +++++- .../host/configurator.ex | 3 - .../host/system_tasks.ex | 5 - .../target/configurator/captive_portal.ex | 0 .../target/configurator/validator.ex | 0 .../configurator/vintage_network_layer.ex | 0 .../target/gpio/circuits_gpio_handler.ex | 0 .../target/gpio/circuits_leds_handler.ex | 0 .../target/info_workers/disk_usage.ex | 0 .../target/info_workers/memory_usage.ex | 0 .../target/info_workers/soc_temp.ex | 0 .../target/info_workers/supervisor.ex | 0 .../target/info_workers/throttle.ex | 0 .../target/info_workers/uptime.ex | 0 .../target/info_workers/wifi_level.ex | 0 .../platform => platform}/target/network.ex | 0 .../target/network/presetup.ex | 0 .../target/network/supervisor.ex | 0 .../target/network/utils.ex | 1 - .../target/rtc_worker.ex | 17 +- .../target/shoehorn_handler.ex | 30 +- .../target/ssh_console.ex | 0 .../target/system_tasks.ex | 0 .../priv => priv}/arduino_firmware.hex | 0 .../priv => priv}/eeprom_clear.ino.hex | 0 {farmbot_core/priv => priv}/express_k10.hex | 0 {farmbot_core/priv => priv}/farmduino.hex | 0 {farmbot_core/priv => priv}/farmduino_k14.hex | 0 {farmbot_core/priv => priv}/farmduino_k15.hex | 0 {farmbot_core/priv => priv}/farmduino_k16.hex | 0 {farmbot_os/priv => priv}/prod.pub | 0 .../20211012213544_initial_migration.exs | 229 ++++++++++++ .../20211013213544_seed_config_groups.exs | 25 ++ {farmbot_os/priv => priv}/staging.pub | 0 .../priv => priv}/static/farmbot_logo.png | Bin .../priv => priv}/static/farmware_schema.json | 0 {farmbot_os/priv => priv}/static/favicon.ico | Bin .../priv => priv}/static/icon_ethernet.svg | 0 {farmbot_os/priv => priv}/static/icon_eye.svg | 0 {farmbot_os/priv => priv}/static/icon_key.svg | 0 .../priv => priv}/static/icon_lock.svg | 0 .../priv => priv}/static/icon_none.svg | 0 .../priv => priv}/static/icon_unknown.svg | 0 .../priv => priv}/static/icon_wifi.svg | 0 {farmbot_os/priv => priv}/static/logger.js | 0 .../static/security_icon_lookup.js | 0 {farmbot_os/priv => priv}/static/styles.css | 0 .../priv => priv}/static/telemetry.html | 0 {farmbot_os/priv => priv}/static/telemetry.js | 0 .../templates/advanced_network.html.eex | 0 .../static/templates/config_wired.html.eex | 0 .../templates/config_wireless_step_1.html.eex | 0 .../config_wireless_step_2_EAP.html.eex | 0 .../config_wireless_step_2_NONE.html.eex | 0 .../config_wireless_step_2_PSK.html.eex | 0 .../config_wireless_step_2_custom.html.eex | 0 .../config_wireless_step_2_other.html.eex | 0 .../static/templates/credentials.html.eex | 0 .../static/templates/finish.html.eex | 0 .../static/templates/firmware.html.eex | 0 .../static/templates/index.html.eex | 0 .../static/templates/logger.html.eex | 0 .../static/templates/network.html.eex | 0 {farmbot_os/rel => rel}/vm.args.eex | 0 .../etc/iex.exs | 0 .../farmware/test.txt | 0 .../usr/share/alsa/alsa.conf | 0 run_all.sh | 32 +- .../test => test}/asset/box_led_test.exs | 0 .../test => test}/asset/command_test.exs | 0 .../asset/criteria_retriever_test.exs | 0 .../test => test}/asset/device_test.exs | 0 .../asset/farm_event_body_node_test.exs | 0 .../test => test}/asset/farm_event_test.exs | 0 .../test => test}/asset/farmware_env_test.exs | 0 .../asset/farmware_installation_test.exs | 0 .../asset/farmware_manifest_test.exs | 0 .../test => test}/asset/fbos_config_test.exs | 0 .../asset/firmware_config_test.exs | 0 .../asset/first_party_farmware_test.exs | 0 .../test => test}/asset/peripheral_test.exs | 0 .../test => test}/asset/pin_binding_test.exs | 0 .../test => test}/asset/point_group_test.exs | 0 .../test => test}/asset/point_test.exs | 0 .../test => test}/asset/private_test.exs | 9 - .../test => test}/asset/public_key_test.exs | 0 .../asset/regimen_body_node_test.exs | 0 .../test => test}/asset/regimen_item_test.exs | 0 .../test => test}/asset/regimen_test.exs | 0 .../asset/sensor_reading_test.exs | 0 .../test => test}/asset/sensor_test.exs | 0 .../test => test}/asset/sequence_test.exs | 0 .../test => test}/asset/storage_auth_test.exs | 0 .../test => test}/asset/sync_item_test.exs | 0 .../test => test}/asset/sync_test.exs | 0 .../test => test}/asset/tool_test.exs | 0 .../test => test}/asset/view_test.exs | 0 .../asset_fixtures.ex => asset_fixtures.exs} | 0 .../test => test}/asset_helpers_test.exs | 0 {farmbot_core/test => test}/asset_test.exs | 1 + .../asset_workers/device_worker_test.exs | 2 +- .../farm_event_worker/regimen_event_test.exs | 5 + .../farm_event_worker/sequence_event_test.exs | 35 +- .../asset_workers/pin_binding_worker_test.exs | 4 +- .../regimen_instance_worker_test.exs | 1 + .../bot_state/filesystem_test.exs | 0 .../bot_state/job_progress_test.exs | 0 .../test => test}/bot_state_ng_test.exs | 0 .../test => test}/bot_state_test.exs | 0 {farmbot_core/test => test}/calendar_test.exs | 0 .../config_storage/group_test.exs | 0 .../config_storage/string_value_test.exs | 0 .../test => test}/dot_props_test.exs | 0 .../assertion_compiler_test.exs | 2 +- .../ast/factory_test.exs | 0 .../farmbot_celery_script/ast_test.exs | 0 .../compiler_groups_test.exs | 4 +- .../farmbot_celery_script/compiler_test.exs | 52 +-- .../compilers/pin_control_compilers_test.exs | 4 +- .../farmbot_celery_script/corpus/arg_test.exs | 0 .../corpus/node_test.exs | 0 .../farmbot_celery_script/corpus_test.exs | 0 .../integration_test.exs | 18 +- .../lua_compiler_test.exs | 0 .../move_compiler_test.exs | 4 +- .../farmbot_celery_script/scheduler_test.exs | 2 +- .../farmbot_celery_script/scope_test.exs | 0 .../special_value_test.exs | 14 +- .../sys_call_glue_test.exs | 78 +++-- .../variable_transformer_test.exs | 2 +- .../farmbot_celery_script_test.exs | 2 +- .../farmbot_ext/api/dirty_worker_test.exs | 11 +- .../api/eager_loader_supervisor_test.exs | 0 .../farmbot_ext/api/eager_loader_test.exs | 0 .../farmbot_ext/api/image_uploader_test.exs | 0 .../farmbot_ext/api/ping_test.exs | 0 .../farmbot_ext/api/preloader_test.exs | 0 .../farmbot_ext/api/reconciler_test.exs | 0 .../farmbot_ext/api/sync_group_test.exs | 0 .../farmbot_ext/api/view_test.exs | 0 .../farmbot_ext/api_fetcher_test.exs | 0 .../test => test}/farmbot_ext/api_test.exs | 0 .../bootstrap/authorization_test.exs | 14 +- .../bootstrap/drop_password_support_test.exs | 0 .../bootstrap/drop_password_task_test.exs | 4 +- .../farmbot_ext/bootstrap/supervisor_test.exs | 0 .../farmbot_ext/bootstrap_test.exs | 11 +- .../test => test}/farmbot_ext/jwt_test.exs | 0 .../mqtt/bot_state_handler_test.exs | 0 .../mqtt/log_handler_support_test.exs | 0 .../farmbot_ext/mqtt/log_handler_test.exs | 0 .../farmbot_ext/mqtt/mqtt_test.exs | 0 .../farmbot_ext/mqtt/ping_handler_test.exs | 0 .../farmbot_ext/mqtt/rpc_handler_test.exs | 3 +- .../farmbot_ext/mqtt/supervisor_test.exs | 0 .../farmbot_ext/mqtt/support_test.exs | 0 .../mqtt/sync_handler_support_test.exs | 3 +- .../farmbot_ext/mqtt/sync_handler_test.exs | 0 .../mqtt/telemetry_handler_test.exs | 0 .../mqtt/terminal_handler_support_test.exs | 0 .../mqtt/terminal_handler_test.exs | 0 .../farmbot_os/avrdude/avrdude_test.exs | 2 +- .../configurator/config_data_layer_test.exs | 0 .../configurator/logger_socket_test.exs | 0 .../farmbot_os/configurator/router_test.exs | 0 .../lua/ext/data_manipulation_test.exs | 2 +- .../farmbot_os/lua/ext/firmware_test.exs | 24 +- .../farmbot_os/lua/ext/info_test.exs | 0 .../farmbot_os/lua/ext/wait_test.exs | 6 +- .../farmbot_os/lua/util_test.exs | 0 .../test => test}/farmbot_os/lua_test.exs | 15 +- .../farmbot_os/sys_calls_test.exs | 0 .../syscalls/change_ownership_test.exs | 0 .../farmbot_os/syscalls/check_update_test.exs | 2 +- .../farmbot_os/syscalls/farmware_test.exs | 0 .../farmbot_os/syscalls/movement_test.exs | 0 .../farmbot_os/syscalls/pin_control_test.exs | 0 .../farmbot_os/syscalls/point_lookup_test.exs | 0 .../syscalls/resource_update_test.exs | 0 .../farmbot_os/syscalls/send_message_test.exs | 0 .../syscalls/set_pin_io_mode_test.exs | 0 .../test => test}/farmbot_os/system_test.exs | 6 +- .../farmbot_os/update_support_test.exs | 0 .../test => test}/farmbot_telemetry_test.exs | 5 +- .../farmware_runtime/pipe_worker_test.exs | 0 .../test => test}/farmware_runtime_test.exs | 0 {farmbot_os/test => test}/filesystem_test.exs | 0 .../test => test}/firmware/command_test.exs | 0 .../firmware/config_uploader_test.exs | 13 +- .../firmware/error_detector_test.exs | 0 .../test => test}/firmware/estop_timer.exs | 0 .../test => test}/firmware/flash_test.exs | 0 .../firmware/flash_utils_test.exs | 0 .../firmware/floating_point_test.exs | 0 .../firmware/gcode_decoder_test.exs | 6 - .../test => test}/firmware/gcode_test.exs | 0 .../firmware/inbound_side_effects_test.exs | 33 +- .../test => test}/firmware/lua_uart_test.exs | 0 .../test => test}/firmware/parameter_test.exs | 0 .../test => test}/firmware/resetter_test.exs | 18 +- .../test => test}/firmware/rx_buffer_test.exs | 0 .../test => test}/firmware/tx_buffer_test.exs | 0 .../firmware/uart_core_support_test.exs | 0 .../test => test}/firmware/uart_core_test.exs | 32 +- .../firmware/uart_observer_test.exs | 0 .../test => test}/fixtures/execute.json | 0 .../fixtures/mark_variable_meta.json | 0 .../fixtures/mark_variable_removed.json | 0 .../fixtures/set_mounted_tool_id.json | 0 .../fixtures/update_resource_multi.json | 0 .../test => test}/http_test.exs | 14 +- .../test => test}/interpolation_test.exs | 0 .../test => test}/leds/stub_handler_test.exs | 0 {farmbot_core/test => test}/log_test.exs | 0 {farmbot_core/test => test}/logger_test.exs | 48 +-- {farmbot_core/test => test}/stub_test.exs | 4 +- .../test_support.ex => test_helper.exs} | 233 ++++++++++++- .../test => test}/vendor/rsa_test.exs | 7 +- 627 files changed, 3390 insertions(+), 6516 deletions(-) delete mode 100755 .circleci/setup-arduino.sh delete mode 100644 Makefile create mode 100644 config/config.exs create mode 100644 config/dev.exs create mode 100644 config/target.exs create mode 100644 config/test.exs rename farmbot_os/coveralls.json => coveralls.json (100%) delete mode 100644 docs/celery_script/celery_script.md delete mode 100644 docs/glossary.md delete mode 100644 docs/index.md delete mode 100644 docs/project/farmbot_core.md delete mode 100644 docs/project/farmbot_ext.md delete mode 100644 docs/project/farmbot_os.md delete mode 100644 docs/project/farmbot_telemetry.md delete mode 100644 docs/project/structure.md delete mode 100644 docs/target_development/building_target_firmware.md delete mode 100644 docs/target_development/consoles/erlang_distribution.md delete mode 100644 docs/target_development/consoles/ssh.md delete mode 100644 docs/target_development/consoles/target_console.md delete mode 100644 docs/target_development/consoles/uart.md delete mode 100644 docs/target_development/releasing_target_firmware.md delete mode 100644 docs/target_development/target_faq.md delete mode 100644 farmbot_core/.formatter.exs delete mode 100644 farmbot_core/.gitignore delete mode 120000 farmbot_core/.tool-versions delete mode 100644 farmbot_core/config/config.exs delete mode 100644 farmbot_core/config/dev.exs delete mode 100644 farmbot_core/config/test.exs delete mode 100644 farmbot_core/coveralls.json delete mode 100644 farmbot_core/fixtures/farmware/test-farmware/run.py delete mode 100644 farmbot_core/lib/farmbot_core.ex delete mode 100644 farmbot_core/lib/farmbot_core/asset/regimen/item.ex delete mode 100644 farmbot_core/lib/farmbot_core/asset/supervisor.ex delete mode 100644 farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex delete mode 100644 farmbot_core/lib/farmbot_core/bot_state/supervisor.ex delete mode 100644 farmbot_core/lib/farmbot_core/config_storage/migration_helpers.ex delete mode 100644 farmbot_core/lib/farmbot_core/config_storage/repo.ex delete mode 100644 farmbot_core/lib/farmbot_core/config_storage/supervisor.ex delete mode 100644 farmbot_core/lib/farmbot_core/ecto_migrator.ex delete mode 100644 farmbot_core/lib/farmbot_core/leds/leds.ex delete mode 100644 farmbot_core/lib/farmbot_core/log_storage/repo.ex delete mode 100644 farmbot_core/lib/farmbot_core/log_storage/supervisor.ex delete mode 100644 farmbot_core/lib/farmbot_core/storage_supervisor.ex delete mode 100644 farmbot_core/mix.exs delete mode 100644 farmbot_core/mix.lock delete mode 100644 farmbot_core/priv/asset/migrations/20181017210730_create_local_metas_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181017210735_create_devices_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181017223659_create_tools_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181017225445_create_peripherals_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181017230326_create_sensors_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181017230333_create_sensor_readings_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181018005030_create_sequences_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181018022229_create_regimens_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181018040229_create_pin_bindings_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019165701_create_points_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019172740_create_farm_events_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019180739_create_firmware_configs_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019180816_create_fbos_configs_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019180911_create_farmware_installations_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019180925_create_farmware_envs_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019180955_create_diagnostic_dumps_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181019181000_create_device_certs_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181022002449_create_syncs_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181022002450_create_persistent_regimens_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20181022002455_create_id_unique_indexes.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190319162822_add_alerts_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190326184305_add_body_to_regimen.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190326211733_rename_persistent_regimens_to_regimen_instances.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190327192248_add_body_to_farmevents.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190424234139_add_update_channel_to_fbos_config.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190614165057_create_regimen_instance_and_farm_event_execution_tables.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190705162506_add_api_migrated_to_fw_config.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190724183349_create_public_keys_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190814180644_create_first_party_farmware_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190918171439_add_ota_update_fields_device.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190923214317_create_point_groups_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190924174628_add_firmware_params.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190926161914_add_point_discarded_at.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190926165507_force_resync_points.exs delete mode 100644 farmbot_core/priv/asset/migrations/20190930204239_add_point_group_sort_by.exs delete mode 100644 farmbot_core/priv/asset/migrations/20191108163819_add_ota_log_to_device.exs delete mode 100644 farmbot_core/priv/asset/migrations/20191108163850_force_resync_device.exs delete mode 100644 farmbot_core/priv/asset/migrations/20191122185123_add_mounted_tool_id_to_device_table.exs delete mode 100644 farmbot_core/priv/asset/migrations/20191122185220_force_resync_device_for_mounted_tool_id.exs delete mode 100644 farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs delete mode 100644 farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200219001135_add_gantry_mounted_fields.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200220214323_invalidate_local_points_gantry_mounted.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200221204400_add_criteria_to_point_group.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200224204400_add_openfarm_slug_to_point.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200411204400_add_pullout_direction_to_point.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200907153510_param_movement_spd_z2.exs delete mode 100644 farmbot_core/priv/asset/migrations/20200930210054_add_soil_height_safe_height.exs delete mode 100644 farmbot_core/priv/asset/migrations/20210510182200_add_calibration_retry_fields.exs delete mode 100644 farmbot_core/priv/asset/migrations/20210511182200_calibration_retry_field_fix.exs delete mode 100644 farmbot_core/priv/asset/migrations/20210514182200_add_stealth_chop_fields.exs delete mode 100644 farmbot_core/priv/asset/migrations/20210514182201_stealth_chop_field_fix.exs delete mode 100644 farmbot_core/priv/asset/migrations/20210914210730_add_device_location_attrs.exs delete mode 100644 farmbot_core/priv/config/migrations/20170922202022_add_eav_tables.exs delete mode 100644 farmbot_core/priv/config/migrations/20170922221449_seed_groups.exs delete mode 100644 farmbot_core/priv/config/migrations/20171025231226_add_farmware_table.exs delete mode 100644 farmbot_core/priv/config/migrations/20171114135840_add_sync_cmd_table.exs delete mode 100644 farmbot_core/priv/config/migrations/20171130004447_add_gpio_registry.exs delete mode 100644 farmbot_core/priv/config/migrations/20171130024651_add_factory_reset_settings.exs delete mode 100644 farmbot_core/priv/config/migrations/20171130044049_add_sequence_complete_log_option.exs delete mode 100644 farmbot_core/priv/config/migrations/20171208041623_arduino_debug_param.exs delete mode 100644 farmbot_core/priv/config/migrations/20171208205940_add_firmware_io_log.exs delete mode 100644 farmbot_core/priv/config/migrations/20171227200214_add_amqp_bootup_log.exs delete mode 100644 farmbot_core/priv/config/migrations/20180103212728_add_beta_chanel_config.exs delete mode 100644 farmbot_core/priv/config/migrations/20180104020301_add_special_fw_migration_config.exs delete mode 100644 farmbot_core/priv/config/migrations/20180122161013_add_api_migrated_flag.exs delete mode 100644 farmbot_core/priv/config/migrations/20180123173929_email_on_estop.exs delete mode 100644 farmbot_core/priv/config/migrations/20180202171932_add_network_interface_deprication.exs delete mode 100644 farmbot_core/priv/config/migrations/20180213164114_ignore_fbos_config.exs delete mode 100644 farmbot_core/priv/config/migrations/20180226174206_network_unique_constraint.exs delete mode 100644 farmbot_core/priv/config/migrations/20180307180141_firmware_initialized_flag.exs delete mode 100644 farmbot_core/priv/config/migrations/20180308162327_add_maybe_hidden_network_flag.exs delete mode 100644 farmbot_core/priv/config/migrations/20180403180047_add_regimen_persistence_table.exs delete mode 100644 farmbot_core/priv/config/migrations/20180403180213_add_sync_timeout.exs delete mode 100644 farmbot_core/priv/config/migrations/20180409142944_param_invert_endstops_2.exs delete mode 100644 farmbot_core/priv/config/migrations/20180411201055_add regimen indexes.exs delete mode 100644 farmbot_core/priv/config/migrations/20180416165217_add_beta_state.exs delete mode 100644 farmbot_core/priv/config/migrations/20180427142609_add_advanced_network_settings.exs delete mode 100644 farmbot_core/priv/config/migrations/20180627122653_add_secret_field.exs delete mode 100644 farmbot_core/priv/config/migrations/20180702143518_add_ntp_and_dns_configs.exs delete mode 100644 farmbot_core/priv/config/migrations/20180724200909_migrate_secret.exs delete mode 100644 farmbot_core/priv/config/migrations/20180802155935_neets_http_sync.exs delete mode 100644 farmbot_core/priv/config/migrations/20180813200950_add_ssh_opts.exs delete mode 100644 farmbot_core/priv/config/migrations/20180814180226_add_farmware_migration.exs delete mode 100644 farmbot_core/priv/config/migrations/20180814202716_add_ignore_fw_config.exs delete mode 100644 farmbot_core/priv/config/migrations/20181203195326_migrate_settings.exs delete mode 100644 farmbot_core/priv/config/migrations/20181204173345_add_firmware_flash_setting.exs delete mode 100644 farmbot_core/priv/config/migrations/20181211191350_add_network_regulatory_domain.exs delete mode 100644 farmbot_core/priv/config/migrations/20190110180643_add_eap_settings.exs delete mode 100644 farmbot_core/priv/config/migrations/20190208211728_add_update_channel_field.exs delete mode 100644 farmbot_core/priv/config/migrations/20190705203806_add_firmware_needs_open_flag.exs delete mode 100644 farmbot_core/priv/config/migrations/20191022175032_set_firmware_flash_true.exs delete mode 100644 farmbot_core/priv/easter_eggs.json delete mode 100644 farmbot_core/priv/logger/migrations/20180620135642_add_log_buffer.exs delete mode 100644 farmbot_core/priv/logger/migrations/20190711221214_add_message_hash_to_logs_table.exs delete mode 100644 farmbot_core/test/firmware/avr_dude_test.exs delete mode 100644 farmbot_core/test/test_helper.exs delete mode 100644 farmbot_ext/.formatter.exs delete mode 100644 farmbot_ext/.gitignore delete mode 120000 farmbot_ext/.tool-versions delete mode 100644 farmbot_ext/config/config.exs delete mode 100644 farmbot_ext/coveralls.json delete mode 100644 farmbot_ext/lib/farmbot_ext.ex delete mode 100644 farmbot_ext/mix.exs delete mode 100644 farmbot_ext/mix.lock delete mode 100644 farmbot_ext/test/farmbot_ext/http_test.exs delete mode 100644 farmbot_ext/test/test_helper.exs delete mode 100644 farmbot_ext/vendor/rsa.ex delete mode 100644 farmbot_os/.formatter.exs delete mode 100644 farmbot_os/.gitignore delete mode 120000 farmbot_os/.tool-versions delete mode 100644 farmbot_os/Makefile delete mode 100644 farmbot_os/config/config.exs delete mode 100644 farmbot_os/config/host/dev.exs delete mode 100644 farmbot_os/config/host/test.exs delete mode 100644 farmbot_os/config/target/dev.exs delete mode 100644 farmbot_os/config/target/prod.exs delete mode 100644 farmbot_os/config/target/rpi.exs delete mode 100644 farmbot_os/config/target/rpi3.exs delete mode 100644 farmbot_os/lib/farmbot_os.ex delete mode 100644 farmbot_os/lib/farmbot_os/easter_eggs.ex delete mode 100644 farmbot_os/mix.exs delete mode 100644 farmbot_os/mix.lock delete mode 100644 farmbot_os/priv/easter_eggs.json delete mode 100644 farmbot_os/test/easter_eggs_test.exs delete mode 100644 farmbot_os/test/test_helper.exs delete mode 100644 farmbot_telemetry/.formatter.exs delete mode 100644 farmbot_telemetry/.gitignore delete mode 100644 farmbot_telemetry/README.md delete mode 100644 farmbot_telemetry/coveralls.json delete mode 100644 farmbot_telemetry/mix.exs delete mode 100644 farmbot_telemetry/mix.lock delete mode 100644 farmbot_telemetry/test/test_helper.exs rename {farmbot_core/fixture => fixtures}/corpus.json (100%) rename {farmbot_core/fixture => fixtures}/every_sequence.json (100%) rename {farmbot_core/fixtures => fixtures}/farmware/test-farmware/manifest.json (100%) rename {farmbot_core/fixture => fixtures}/inner_sequence.json (100%) rename {farmbot_core/fixture => fixtures}/outer_sequence.json (100%) rename {farmbot_core/fixture => fixtures}/paramater_sequence.json (100%) rename {farmbot_core/fixture => fixtures}/point_group_sequence.json (100%) rename {farmbot_core/fixtures => fixtures}/regimens/regimen_with_variables.json (100%) rename {farmbot_core/fixture => fixtures}/sequence_pair.json (100%) rename {farmbot_core/fixture => fixtures}/unbound.json (100%) rename {farmbot_core/fixture => fixtures}/unbound_var_x.json (100%) rename {farmbot_os/lib => lib}/avrdude.ex (100%) rename {farmbot_core/lib => lib}/celery.ex (75%) rename {farmbot_core/lib => lib}/celery/ast.ex (100%) rename {farmbot_core/lib => lib}/celery/ast/factory.ex (100%) rename {farmbot_core/lib => lib}/celery/compiler.ex (87%) rename {farmbot_core/lib => lib}/celery/compiler/utils.ex (63%) rename {farmbot_core/lib => lib}/celery/compilers/assertion_compiler.ex (85%) rename {farmbot_core/lib => lib}/celery/compilers/axis_control_compiler.ex (54%) rename {farmbot_core/lib => lib}/celery/compilers/data_control_compiler.ex (84%) rename {farmbot_core/lib => lib}/celery/compilers/execute_compiler.ex (92%) rename {farmbot_core/lib => lib}/celery/compilers/farmware_compiler.ex (76%) rename {farmbot_core/lib => lib}/celery/compilers/if_compiler.ex (83%) rename {farmbot_core/lib => lib}/celery/compilers/lua.ex (69%) rename {farmbot_core/lib => lib}/celery/compilers/move_compiler.ex (86%) rename {farmbot_core/lib => lib}/celery/compilers/pin_control_compiler.ex (62%) rename {farmbot_core/lib => lib}/celery/compilers/rpc_request_compiler.ex (80%) rename {farmbot_core/lib => lib}/celery/compilers/scope.ex (83%) rename {farmbot_core/lib => lib}/celery/compilers/sequence_compiler.ex (71%) rename {farmbot_core/lib => lib}/celery/compilers/update_resource_compiler.ex (84%) rename {farmbot_core/lib => lib}/celery/compilers/variable_transformer.ex (74%) rename {farmbot_core/lib => lib}/celery/corpus.ex (96%) rename {farmbot_core/lib => lib}/celery/corpus/arg.ex (100%) rename {farmbot_core/lib => lib}/celery/corpus/node.ex (100%) rename {farmbot_core/lib => lib}/celery/dot_props.ex (100%) rename {farmbot_core/lib => lib}/celery/format_util.ex (100%) rename {farmbot_core/lib => lib}/celery/interpolation.ex (51%) rename {farmbot_core/lib => lib}/celery/runtime_error.ex (100%) rename {farmbot_core/lib => lib}/celery/scheduler.ex (99%) rename {farmbot_core/lib => lib}/celery/special_value.ex (81%) rename {farmbot_core/lib => lib}/celery/step_runner.ex (91%) rename farmbot_core/lib/celery/sys_calls.ex => lib/celery/sys_call_glue.ex (98%) rename {farmbot_core/lib => lib}/celery/sys_calls/stubs.ex (97%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset.ex (85%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/box_led.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/command.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/criteria_retriever.ex (65%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/device.ex (98%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/farm_event.ex (83%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/farm_event/body_node.ex (92%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/farm_event/execution.ex (76%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/farmware_env.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/farmware_installation.ex (85%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/farmware_installation/manifest.ex (86%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/fbos_config.ex (96%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/firmware_config.ex (91%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/first_party_farmware.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/peripheral.ex (88%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/pin_binding.ex (77%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/point.ex (94%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/point_group.ex (94%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/private.ex (72%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/private/local_meta.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/public_key.ex (92%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/regimen.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/regimen/body_node.ex (86%) create mode 100644 lib/core/asset/regimen/item.ex rename {farmbot_core/lib/farmbot_core => lib/core}/asset/regimen_instance.ex (76%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/regimen_instance/execution.ex (75%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/repo.ex (55%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/schema.ex (98%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/sensor.ex (87%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/sensor_reading.ex (86%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/sequence.ex (84%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/storage_auth.ex (89%) create mode 100644 lib/core/asset/supervisor.ex rename {farmbot_core/lib/farmbot_core => lib/core}/asset/sync.ex (92%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/tool.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset/view.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_monitor.ex (84%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_worker.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/device_worker.ex (79%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/farm_event_worker.ex (99%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/farm_event_worker/regimen_event.ex (59%) create mode 100644 lib/core/asset_workers/farm_event_worker/sequence_event.ex rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/farmware_env_worker.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/farmware_installation_worker.ex (76%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/fbos_config_worker.ex (52%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/firmware_config_worker.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/first_party_farmware_worker.ex (99%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/peripheral_worker.ex (73%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/pin_binding_worker.ex (70%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/pin_binding_worker/stub_gpio_handler.ex (99%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/public_key_worker.ex (80%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/public_key_worker/stub_ssh_handler.ex (97%) rename {farmbot_core/lib/farmbot_core => lib/core}/asset_workers/regimen_instance_worker.ex (58%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state.ex (95%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state/filesystem.ex (70%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state/job_progress.ex (76%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state/scheduler_usage_reporter.ex (94%) create mode 100644 lib/core/bot_state/supervisor.ex rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng.ex (86%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng/configuration.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng/informational_settings.ex (97%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng/location_data.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng/location_data/vec3.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng/location_data/vec3_string.ex (99%) rename {farmbot_core/lib/farmbot_core => lib/core}/bot_state_ng/mcu_params.ex (53%) rename {farmbot_core/lib/farmbot_core => lib/core}/calendar.ex (100%) rename farmbot_core/lib/farmbot_core/asset_supervisor.ex => lib/core/change_supervisor.ex (95%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/bool_value.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/config.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/config_storage.ex (73%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/float_value.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/group.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/network_interface.ex (74%) rename {farmbot_core/lib/farmbot_core => lib/core}/config_storage/string_value.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/farmware_runtime.ex (88%) rename {farmbot_core/lib/farmbot_core => lib/core}/farmware_runtime/pipe_worker.ex (64%) rename {farmbot_core/lib/farmbot_core => lib/core}/firmware_estop_timer.ex (90%) rename {farmbot_core/lib/farmbot_core => lib/core}/json.ex (90%) rename {farmbot_core/lib/farmbot_core => lib/core}/json/jason_parser.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/json/parser.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/leds/led_handler.ex (100%) create mode 100644 lib/core/leds/leds.ex rename {farmbot_core/lib/farmbot_core => lib/core}/leds/stub_handler.ex (100%) rename {farmbot_core/lib/farmbot_core => lib/core}/log_storage/log.ex (79%) rename {farmbot_core/lib/farmbot_core => lib/core}/log_storage/log_executor.ex (99%) rename {farmbot_core/lib/farmbot_core => lib/core}/log_storage/logger.ex (65%) rename {farmbot_core/lib/farmbot_core => lib/core}/project.ex (66%) rename {farmbot_core/lib/farmbot_core => lib/core}/time_utils.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api/image_uploader.ex (95%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api/ping.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api/preloader.ex (86%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api/reconciler.ex (92%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api/sync_group.ex (93%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api/view.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api_adapter.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/api_fetcher.ex (85%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/bootstrap.ex (82%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/bootstrap/authorization.ex (82%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/bootstrap/drop_password_support.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/bootstrap/drop_password_task.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/bootstrap/supervisor.ex (91%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/dirty_worker.ex (99%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/dirty_worker/supervisor.ex (95%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/eager_loader.ex (91%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/eager_loader/supervisor.ex (89%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/jwt.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/bot_state_handler.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/log_handler.ex (99%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/log_handler_support.ex (94%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/mqtt.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/ping_handler.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/rpc_handler.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/supervisor.ex (96%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/support.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/sync_handler.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/sync_handler_support.ex (94%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/telemetry_handler.ex (91%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/terminal_handler.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/terminal_handler_support.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/mqtt/topic_supervisor.ex (100%) rename {farmbot_ext/lib/farmbot_ext => lib/ext}/time.ex (92%) create mode 100644 lib/farmbot_os.ex rename {farmbot_telemetry/lib => lib}/farmbot_telemetry.ex (72%) rename {farmbot_core/lib => lib}/firmware/avrdude.ex (100%) rename {farmbot_core/lib => lib}/firmware/command.ex (100%) rename {farmbot_core/lib => lib}/firmware/config_uploader.ex (100%) rename {farmbot_core/lib => lib}/firmware/error_detector.ex (100%) rename {farmbot_core/lib => lib}/firmware/flash.ex (100%) rename {farmbot_core/lib => lib}/firmware/flash_utils.ex (94%) rename {farmbot_core/lib => lib}/firmware/floating_point.ex (100%) rename {farmbot_core/lib => lib}/firmware/gcode.ex (100%) rename {farmbot_core/lib => lib}/firmware/gcode_decoder.ex (95%) rename {farmbot_core/lib => lib}/firmware/inbound_side_effects.ex (100%) rename {farmbot_core/lib => lib}/firmware/lua_uart.ex (100%) rename {farmbot_core/lib => lib}/firmware/parameter.ex (100%) rename {farmbot_core/lib => lib}/firmware/request.ex (100%) rename {farmbot_core/lib => lib}/firmware/resetter.ex (100%) rename {farmbot_core/lib => lib}/firmware/rx_buffer.ex (100%) rename {farmbot_core/lib => lib}/firmware/tx_buffer.ex (100%) rename {farmbot_core/lib => lib}/firmware/uart_core.ex (100%) rename {farmbot_core/lib => lib}/firmware/uart_core_support.ex (100%) rename {farmbot_core/lib => lib}/firmware/uart_detector.ex (100%) rename {farmbot_core/lib => lib}/firmware/uart_observer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/config_data_layer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/data_layer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/dets_telemetry_layer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/fake_network_layer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/logger_backend.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/logger_socket.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/network_layer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/router.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/supervisor.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/configurator/telemetry_layer.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/filesystem.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/init/fs_checkup.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/init/supervisor.ex (100%) create mode 100644 lib/os/legacy_migrator.ex rename {farmbot_os/lib/farmbot_os => lib/os}/lua.ex (96%) rename {farmbot_os/lib/farmbot_os => lib/os}/lua/data_manipulation.ex (99%) rename {farmbot_os/lib/farmbot_os => lib/os}/lua/firmware.ex (78%) rename {farmbot_os/lib/farmbot_os => lib/os}/lua/info.ex (95%) rename {farmbot_os/lib/farmbot_os => lib/os}/lua/util.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/lua/wait.ex (68%) create mode 100644 lib/os/migrator.ex rename {farmbot_os/lib/farmbot_os => lib/os}/platform_supervisor.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls.ex (98%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/change_ownership.ex (95%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/check_update.ex (96%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/factory_reset.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/farmware.ex (94%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/movement.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/pin_control.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/point_lookup.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/resource_update.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/send_message.ex (96%) rename {farmbot_os/lib/farmbot_os => lib/os}/sys_calls/set_pin_io_mode.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/system.ex (79%) rename {farmbot_os/lib/farmbot_os => lib/os}/update_progress.ex (100%) rename {farmbot_os/lib/farmbot_os => lib/os}/update_support.ex (93%) rename {farmbot_telemetry/lib/farmbot_telemetry => lib/telemetry}/application.ex (80%) rename {farmbot_telemetry/lib/farmbot_telemetry => lib/telemetry}/http.ex (94%) rename {farmbot_os/platform => platform}/host/configurator.ex (81%) rename {farmbot_os/platform => platform}/host/system_tasks.ex (62%) rename {farmbot_os/platform => platform}/target/configurator/captive_portal.ex (100%) rename {farmbot_os/platform => platform}/target/configurator/validator.ex (100%) rename {farmbot_os/platform => platform}/target/configurator/vintage_network_layer.ex (100%) rename {farmbot_os/platform => platform}/target/gpio/circuits_gpio_handler.ex (100%) rename {farmbot_os/platform => platform}/target/gpio/circuits_leds_handler.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/disk_usage.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/memory_usage.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/soc_temp.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/supervisor.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/throttle.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/uptime.ex (100%) rename {farmbot_os/platform => platform}/target/info_workers/wifi_level.ex (100%) rename {farmbot_os/platform => platform}/target/network.ex (100%) rename {farmbot_os/platform => platform}/target/network/presetup.ex (100%) rename {farmbot_os/platform => platform}/target/network/supervisor.ex (100%) rename {farmbot_os/platform => platform}/target/network/utils.ex (99%) rename {farmbot_os/platform => platform}/target/rtc_worker.ex (94%) rename {farmbot_os/platform => platform}/target/shoehorn_handler.ex (66%) rename {farmbot_os/platform => platform}/target/ssh_console.ex (100%) rename {farmbot_os/platform => platform}/target/system_tasks.ex (100%) rename {farmbot_core/priv => priv}/arduino_firmware.hex (100%) rename {farmbot_core/priv => priv}/eeprom_clear.ino.hex (100%) rename {farmbot_core/priv => priv}/express_k10.hex (100%) rename {farmbot_core/priv => priv}/farmduino.hex (100%) rename {farmbot_core/priv => priv}/farmduino_k14.hex (100%) rename {farmbot_core/priv => priv}/farmduino_k15.hex (100%) rename {farmbot_core/priv => priv}/farmduino_k16.hex (100%) rename {farmbot_os/priv => priv}/prod.pub (100%) create mode 100644 priv/repo/migrations/20211012213544_initial_migration.exs create mode 100644 priv/repo/migrations/20211013213544_seed_config_groups.exs rename {farmbot_os/priv => priv}/staging.pub (100%) rename {farmbot_os/priv => priv}/static/farmbot_logo.png (100%) rename {farmbot_os/priv => priv}/static/farmware_schema.json (100%) rename {farmbot_os/priv => priv}/static/favicon.ico (100%) rename {farmbot_os/priv => priv}/static/icon_ethernet.svg (100%) rename {farmbot_os/priv => priv}/static/icon_eye.svg (100%) rename {farmbot_os/priv => priv}/static/icon_key.svg (100%) rename {farmbot_os/priv => priv}/static/icon_lock.svg (100%) rename {farmbot_os/priv => priv}/static/icon_none.svg (100%) rename {farmbot_os/priv => priv}/static/icon_unknown.svg (100%) rename {farmbot_os/priv => priv}/static/icon_wifi.svg (100%) rename {farmbot_os/priv => priv}/static/logger.js (100%) rename {farmbot_os/priv => priv}/static/security_icon_lookup.js (100%) rename {farmbot_os/priv => priv}/static/styles.css (100%) rename {farmbot_os/priv => priv}/static/telemetry.html (100%) rename {farmbot_os/priv => priv}/static/telemetry.js (100%) rename {farmbot_os/priv => priv}/static/templates/advanced_network.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wired.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wireless_step_1.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wireless_step_2_EAP.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wireless_step_2_NONE.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wireless_step_2_PSK.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wireless_step_2_custom.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/config_wireless_step_2_other.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/credentials.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/finish.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/firmware.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/index.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/logger.html.eex (100%) rename {farmbot_os/priv => priv}/static/templates/network.html.eex (100%) rename {farmbot_os/rel => rel}/vm.args.eex (100%) rename {farmbot_os/rootfs_overlay => rootfs_overlay}/etc/iex.exs (100%) rename {farmbot_os/rootfs_overlay => rootfs_overlay}/farmware/test.txt (100%) rename {farmbot_os/rootfs_overlay => rootfs_overlay}/usr/share/alsa/alsa.conf (100%) rename {farmbot_core/test => test}/asset/box_led_test.exs (100%) rename {farmbot_core/test => test}/asset/command_test.exs (100%) rename {farmbot_core/test => test}/asset/criteria_retriever_test.exs (100%) rename {farmbot_core/test => test}/asset/device_test.exs (100%) rename {farmbot_core/test => test}/asset/farm_event_body_node_test.exs (100%) rename {farmbot_core/test => test}/asset/farm_event_test.exs (100%) rename {farmbot_core/test => test}/asset/farmware_env_test.exs (100%) rename {farmbot_core/test => test}/asset/farmware_installation_test.exs (100%) rename {farmbot_core/test => test}/asset/farmware_manifest_test.exs (100%) rename {farmbot_core/test => test}/asset/fbos_config_test.exs (100%) rename {farmbot_core/test => test}/asset/firmware_config_test.exs (100%) rename {farmbot_core/test => test}/asset/first_party_farmware_test.exs (100%) rename {farmbot_core/test => test}/asset/peripheral_test.exs (100%) rename {farmbot_core/test => test}/asset/pin_binding_test.exs (100%) rename {farmbot_core/test => test}/asset/point_group_test.exs (100%) rename {farmbot_core/test => test}/asset/point_test.exs (100%) rename {farmbot_core/test => test}/asset/private_test.exs (88%) rename {farmbot_core/test => test}/asset/public_key_test.exs (100%) rename {farmbot_core/test => test}/asset/regimen_body_node_test.exs (100%) rename {farmbot_core/test => test}/asset/regimen_item_test.exs (100%) rename {farmbot_core/test => test}/asset/regimen_test.exs (100%) rename {farmbot_core/test => test}/asset/sensor_reading_test.exs (100%) rename {farmbot_core/test => test}/asset/sensor_test.exs (100%) rename {farmbot_core/test => test}/asset/sequence_test.exs (100%) rename {farmbot_core/test => test}/asset/storage_auth_test.exs (100%) rename {farmbot_core/test => test}/asset/sync_item_test.exs (100%) rename {farmbot_core/test => test}/asset/sync_test.exs (100%) rename {farmbot_core/test => test}/asset/tool_test.exs (100%) rename {farmbot_core/test => test}/asset/view_test.exs (100%) rename test/{support/asset_fixtures.ex => asset_fixtures.exs} (100%) rename {farmbot_core/test => test}/asset_helpers_test.exs (100%) rename {farmbot_core/test => test}/asset_test.exs (96%) rename {farmbot_core/test => test}/asset_workers/device_worker_test.exs (96%) rename {farmbot_core/test => test}/asset_workers/farm_event_worker/regimen_event_test.exs (93%) rename {farmbot_core/test => test}/asset_workers/farm_event_worker/sequence_event_test.exs (61%) rename {farmbot_core/test => test}/asset_workers/pin_binding_worker_test.exs (83%) rename {farmbot_core/test => test}/asset_workers/regimen_instance_worker_test.exs (91%) rename {farmbot_core/test => test}/bot_state/filesystem_test.exs (100%) rename {farmbot_core/test => test}/bot_state/job_progress_test.exs (100%) rename {farmbot_core/test => test}/bot_state_ng_test.exs (100%) rename {farmbot_core/test => test}/bot_state_test.exs (100%) rename {farmbot_core/test => test}/calendar_test.exs (100%) rename {farmbot_core/test => test}/config_storage/group_test.exs (100%) rename {farmbot_core/test => test}/config_storage/string_value_test.exs (100%) rename {farmbot_core/test => test}/dot_props_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/assertion_compiler_test.exs (92%) rename {farmbot_core/test => test}/farmbot_celery_script/ast/factory_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/ast_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/compiler_groups_test.exs (81%) rename {farmbot_core/test => test}/farmbot_celery_script/compiler_test.exs (82%) rename {farmbot_core/test => test}/farmbot_celery_script/compilers/pin_control_compilers_test.exs (76%) rename {farmbot_core/test => test}/farmbot_celery_script/corpus/arg_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/corpus/node_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/corpus_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/integration_test.exs (65%) rename {farmbot_core/test => test}/farmbot_celery_script/lua_compiler_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/move_compiler_test.exs (99%) rename {farmbot_core/test => test}/farmbot_celery_script/scheduler_test.exs (95%) rename {farmbot_core/test => test}/farmbot_celery_script/scope_test.exs (100%) rename {farmbot_core/test => test}/farmbot_celery_script/special_value_test.exs (91%) rename farmbot_core/test/farmbot_celery_script/sys_calls_test.exs => test/farmbot_celery_script/sys_call_glue_test.exs (61%) rename {farmbot_core/test => test}/farmbot_celery_script/variable_transformer_test.exs (96%) rename {farmbot_core/test => test}/farmbot_celery_script_test.exs (98%) rename {farmbot_ext/test => test}/farmbot_ext/api/dirty_worker_test.exs (91%) rename {farmbot_ext/test => test}/farmbot_ext/api/eager_loader_supervisor_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/eager_loader_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/image_uploader_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/ping_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/preloader_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/reconciler_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/sync_group_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api/view_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api_fetcher_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/api_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/bootstrap/authorization_test.exs (77%) rename {farmbot_ext/test => test}/farmbot_ext/bootstrap/drop_password_support_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/bootstrap/drop_password_task_test.exs (89%) rename {farmbot_ext/test => test}/farmbot_ext/bootstrap/supervisor_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/bootstrap_test.exs (77%) rename {farmbot_ext/test => test}/farmbot_ext/jwt_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/bot_state_handler_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/log_handler_support_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/log_handler_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/mqtt_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/ping_handler_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/rpc_handler_test.exs (96%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/supervisor_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/support_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/sync_handler_support_test.exs (96%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/sync_handler_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/telemetry_handler_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/terminal_handler_support_test.exs (100%) rename {farmbot_ext/test => test}/farmbot_ext/mqtt/terminal_handler_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/avrdude/avrdude_test.exs (97%) rename {farmbot_os/test => test}/farmbot_os/configurator/config_data_layer_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/configurator/logger_socket_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/configurator/router_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/lua/ext/data_manipulation_test.exs (99%) rename {farmbot_os/test => test}/farmbot_os/lua/ext/firmware_test.exs (75%) rename {farmbot_os/test => test}/farmbot_os/lua/ext/info_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/lua/ext/wait_test.exs (75%) rename {farmbot_os/test => test}/farmbot_os/lua/util_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/lua_test.exs (93%) rename {farmbot_os/test => test}/farmbot_os/sys_calls_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/change_ownership_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/check_update_test.exs (97%) rename {farmbot_os/test => test}/farmbot_os/syscalls/farmware_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/movement_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/pin_control_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/point_lookup_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/resource_update_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/send_message_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/syscalls/set_pin_io_mode_test.exs (100%) rename {farmbot_os/test => test}/farmbot_os/system_test.exs (71%) rename {farmbot_os/test => test}/farmbot_os/update_support_test.exs (100%) rename {farmbot_telemetry/test => test}/farmbot_telemetry_test.exs (90%) rename {farmbot_core/test => test}/farmware_runtime/pipe_worker_test.exs (100%) rename {farmbot_core/test => test}/farmware_runtime_test.exs (100%) rename {farmbot_os/test => test}/filesystem_test.exs (100%) rename {farmbot_core/test => test}/firmware/command_test.exs (100%) rename {farmbot_core/test => test}/firmware/config_uploader_test.exs (74%) rename {farmbot_core/test => test}/firmware/error_detector_test.exs (100%) rename {farmbot_core/test => test}/firmware/estop_timer.exs (100%) rename {farmbot_core/test => test}/firmware/flash_test.exs (100%) rename {farmbot_core/test => test}/firmware/flash_utils_test.exs (100%) rename {farmbot_core/test => test}/firmware/floating_point_test.exs (100%) rename {farmbot_core/test => test}/firmware/gcode_decoder_test.exs (89%) rename {farmbot_core/test => test}/firmware/gcode_test.exs (100%) rename {farmbot_core/test => test}/firmware/inbound_side_effects_test.exs (91%) rename {farmbot_core/test => test}/firmware/lua_uart_test.exs (100%) rename {farmbot_core/test => test}/firmware/parameter_test.exs (100%) rename {farmbot_core/test => test}/firmware/resetter_test.exs (54%) rename {farmbot_core/test => test}/firmware/rx_buffer_test.exs (100%) rename {farmbot_core/test => test}/firmware/tx_buffer_test.exs (100%) rename {farmbot_core/test => test}/firmware/uart_core_support_test.exs (100%) rename {farmbot_core/test => test}/firmware/uart_core_test.exs (86%) rename {farmbot_core/test => test}/firmware/uart_observer_test.exs (100%) rename {farmbot_core/test => test}/fixtures/execute.json (100%) rename {farmbot_core/test => test}/fixtures/mark_variable_meta.json (100%) rename {farmbot_core/test => test}/fixtures/mark_variable_removed.json (100%) rename {farmbot_core/test => test}/fixtures/set_mounted_tool_id.json (100%) rename {farmbot_core/test => test}/fixtures/update_resource_multi.json (100%) rename {farmbot_telemetry/test => test}/http_test.exs (57%) rename {farmbot_core/test => test}/interpolation_test.exs (100%) rename {farmbot_core/test => test}/leds/stub_handler_test.exs (100%) rename {farmbot_core/test => test}/log_test.exs (100%) rename {farmbot_core/test => test}/logger_test.exs (58%) rename {farmbot_core/test => test}/stub_test.exs (96%) rename test/{support/test_support.ex => test_helper.exs} (52%) rename {farmbot_ext/test => test}/vendor/rsa_test.exs (57%) diff --git a/.circleci/config.yml b/.circleci/config.yml index 94a5ffa76..82006c3b3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,11 +21,6 @@ install_hex_archives: &install_hex_archives mix local.rebar --force mix archive.install hex nerves_bootstrap "~> 1.10" --force -install_arduino: &install_arduino - run: - name: Run setup script - command: bash .circleci/setup-arduino.sh - install_ghr: &install_ghr run: name: Install ghr (Github Releases) @@ -67,15 +62,15 @@ steps_to_build_cached_firmware: &steps_to_build_cached_firmware echo "$MIX_TARGET" > MIX_TARGET echo "$MIX_ENV" > MIX_ENV - restore_cache: - key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "mix.lock" }} - restore_cache: - key: v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + key: v14-fbos-host-test-dependency-cache-{{ checksum "mix.lock" }} - <<: *install_elixir - <<: *install_hex_archives - <<: *install_libnl - run: name: Build Farmbot OS Firmware - working_directory: /nerves/build/farmbot_os + working_directory: /nerves/build command: | mix deps.get mix compile --force @@ -86,12 +81,12 @@ steps_to_build_cached_firmware: &steps_to_build_cached_firmware - run: name: Create artifacts command: | - cp /nerves/build/farmbot_os/_build/${MIX_TARGET}/${MIX_TARGET}_${MIX_ENV}/nerves/images/farmbot.fw /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw + cp /nerves/build/_build/${MIX_TARGET}/${MIX_TARGET}_${MIX_ENV}/nerves/images/farmbot.fw /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw - save_cache: - key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "mix.lock" }} paths: - - /nerves/build/farmbot_os/_build/ - - /nerves/build/farmbot_os/deps/ + - /nerves/build/_build/ + - /nerves/build/deps/ - ~/.nerves/ - save_cache: key: nerves/deploy/system-{{ checksum "MIX_TARGET" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }} @@ -112,7 +107,7 @@ steps_to_build_fresh_firmware: &steps_to_build_fresh_firmware - <<: *install_libnl - run: name: Build Farmbot OS Firmware - working_directory: /nerves/build/farmbot_os + working_directory: /nerves/build command: | mix deps.get mix compile --force @@ -123,12 +118,12 @@ steps_to_build_fresh_firmware: &steps_to_build_fresh_firmware - run: name: Create artifacts command: | - cp /nerves/build/farmbot_os/_build/${MIX_TARGET}/${MIX_TARGET}_${MIX_ENV}/nerves/images/farmbot.fw /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw + cp /nerves/build/_build/${MIX_TARGET}/${MIX_TARGET}_${MIX_ENV}/nerves/images/farmbot.fw /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw - save_cache: - key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "mix.lock" }} paths: - - /nerves/build/farmbot_os/_build/ - - /nerves/build/farmbot_os/deps/ + - /nerves/build/_build/ + - /nerves/build/deps/ - ~/.nerves/ - save_cache: key: nerves/deploy/system-{{ checksum "MIX_TARGET" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }} @@ -145,7 +140,7 @@ predeploy_setup: &predeploy_setup echo "$MIX_TARGET" > MIX_TARGET echo "$MIX_ENV" > MIX_ENV - restore_cache: - key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + key: v14-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "mix.lock" }} - restore_cache: key: nerves/deploy/system-{{ checksum "MIX_TARGET" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }} - <<: *install_elixir @@ -157,135 +152,6 @@ jobs: ################################################################################ # TEST # ################################################################################ - test_farmbot_telemetry: - <<: *defaults - environment: - MIX_ENV: test - MIX_TARGET: host - ELIXIR_VERSION: 1.12.2 - steps: - - checkout - - run: git submodule update --init --recursive - - restore_cache: - keys: - - v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_telemetry/mix.lock" }} - - <<: *install_elixir - - <<: *install_hex_archives - - run: - name: Test Farmbot Telemetry - working_directory: /nerves/build/farmbot_telemetry - command: | - mix deps.get - mix compile - mix format --check-formatted - mix coveralls.json - bash <(curl -s https://codecov.io/bash) - - save_cache: - key: v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_telemetry/mix.lock" }} - paths: - - farmbot_telemetry/_build/host - - farmbot_telemetry/deps/host - - save_cache: - key: v14-fbos-coverage-cache-{{ .Branch }}-{{ .Revision }} - paths: - - farmbot_telemetry/cover - - store_artifacts: - path: farmbot_telemetry/cover - - test_farmbot_core: - <<: *defaults - environment: - MIX_ENV: test - MIX_TARGET: host - NERVES_LOG_DISABLE_PROGRESS_BAR: "yes" - ELIXIR_VERSION: 1.12.2 - TZ: "America/Los_Angeles" - steps: - - checkout - - run: git submodule update --init --recursive - - restore_cache: - keys: - - v14-fbcore-test-dependency-cache-{{ checksum "farmbot_core/mix.lock" }} - - restore_cache: - keys: - - v14-fbcore-test-arduino-dependency-cache-{{ checksum ".circleci/setup-arduino.sh" }} - - <<: *install_elixir - - <<: *install_hex_archives - - <<: *install_arduino - - run: - name: Ensure format - command: | - mix format --check-formatted - - run: - name: Test Farmbot Core - working_directory: /nerves/build/farmbot_core - command: | - mix deps.get - mix compile - mix format --check-formatted - mix coveralls.json --trace - bash <(curl -s https://codecov.io/bash) - - save_cache: - key: v14-fbcore-test-dependency-cache-{{ checksum "farmbot_core/mix.lock" }} - paths: - - farmbot_core/_build/test - - farmbot_core/deps - - farmbot_core/arduino - - save_cache: - key: v14-fbcore-coverage-cache-{{ .Branch }}-{{ .Revision }} - paths: - - farmbot_core/cover - - store_artifacts: - path: farmbot_core/cover - - save_cache: - key: v14-fbcore-test-arduino-dependency-cache-{{ checksum ".circleci/setup-arduino.sh" }} - paths: - - ~/arduino-1.8.5 - - farmbot_core/_build/core - - farmbot_core/_build/libraries - - farmbot_core/_build/farmduino_k14 - - farmbot_core/_build/farmduino_v10 - - farmbot_core/_build/ramps_v14 - - test_farmbot_ext: - <<: *defaults - environment: - MIX_ENV: test - MIX_TARGET: host - NERVES_LOG_DISABLE_PROGRESS_BAR: "yes" - ELIXIR_VERSION: 1.12.2 - SKIP_ARDUINO_BUILD: 1 - steps: - - checkout - - run: git submodule update --init --recursive - - restore_cache: - keys: - - v14-fbext-test-dependency-cache-{{ checksum "farmbot_ext/mix.lock" }} - - <<: *install_elixir - - <<: *install_hex_archives - - run: - name: Test Farmbot Ext - working_directory: /nerves/build/farmbot_ext - command: | - mix deps.get - mix compile - mix format --check-formatted - mix ecto.create - mix ecto.migrate - mix coveralls.json - bash <(curl -s https://codecov.io/bash) - - save_cache: - key: v14-fbext-test-dependency-cache-{{ checksum "farmbot_ext/mix.lock" }} - paths: - - farmbot_ext/_build/test - - farmbot_ext/deps - - save_cache: - key: v14-fbext-coverage-cache-{{ .Branch }}-{{ .Revision }} - paths: - - farmbot_ext/cover - - store_artifacts: - path: farmbot_ext/cover - test_farmbot_os: <<: *defaults environment: @@ -298,12 +164,12 @@ jobs: - run: git submodule update --init --recursive - restore_cache: keys: - - v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + - v14-fbos-host-test-dependency-cache-{{ checksum "mix.lock" }} - <<: *install_elixir - <<: *install_hex_archives - run: name: Test Farmbot OS - working_directory: /nerves/build/farmbot_os + working_directory: /nerves/build command: | mix deps.get mix compile @@ -311,16 +177,16 @@ jobs: mix coveralls.json bash <(curl -s https://codecov.io/bash) - save_cache: - key: v14-fbos-host-test-dependency-cache-{{ checksum "farmbot_os/mix.lock" }} + key: v14-fbos-host-test-dependency-cache-{{ checksum "mix.lock" }} paths: - farmbot_os/_build/host - farmbot_os/deps/host - save_cache: key: v14-fbos-coverage-cache-{{ .Branch }}-{{ .Revision }} paths: - - farmbot_os/cover + - cover - store_artifacts: - path: farmbot_os/cover + path: cover ################################################################################ # Build the targets @@ -422,24 +288,6 @@ workflows: version: 2 test: jobs: - - test_farmbot_telemetry: - context: org-global - filters: - branches: - ignore: - - main - - test_farmbot_core: - context: org-global - filters: - branches: - ignore: - - main - - test_farmbot_ext: - context: org-global - filters: - branches: - ignore: - - main - test_farmbot_os: context: org-global filters: diff --git a/.circleci/setup-arduino.sh b/.circleci/setup-arduino.sh deleted file mode 100755 index 464c6b4ff..000000000 --- a/.circleci/setup-arduino.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -ARDUINO_VERSION=1.8.5 -if [ ! -d "$HOME/arduino-$ARDUINO_VERSION" ]; then - wget https://downloads.arduino.cc/arduino-$ARDUINO_VERSION-linux64.tar.xz - tar xf arduino-$ARDUINO_VERSION-linux64.tar.xz - mv arduino-$ARDUINO_VERSION $HOME -else - echo "arduino $ARDUINO_VERSION already installed" -fi diff --git a/.formatter.exs b/.formatter.exs index 1cc2c6e11..675b30f8a 100644 --- a/.formatter.exs +++ b/.formatter.exs @@ -1,3 +1,11 @@ [ - inputs: ["*.{ex,exs}", "{test}/**/*.{ex,exs}"] + import_deps: [:ecto], + line_length: 80, + inputs: [ + "*.{ex,exs}", + "{config,priv,test}/**/*.{ex,exs}", + "lib/**/*.{ex,exs}", + "platform/**/*.{ex,exs}" + ], + subdirectories: ["priv/*/migrations"] ] diff --git a/.gitignore b/.gitignore index ea5376b5f..93e91f78e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,60 +1,58 @@ -# App artifacts +_nerves-tmp +!/nerves/host +!/nerves/target +.elixir_ls +.env +.make_state +*.coverdata +*.crashdump +*.csv +*.db +*.db-journal +*.db-shm +*.db-wal +*.ez +*.img +*.lua +*.o +*.pem +*.priv +*.so +*.sqlite3 +*.sqlite3* +*screenlog* /_build +/_build/ +/_images +/.fetch +/.nerves +/*.ez +/cache +/cover +/cover/ /db /deps -/*.ez +/deps/ /doc -/cover -ttb_last_config - -# Nerves artifacts -/_images -/.nerves +/doc/ /images +/log /nerves/* -!/nerves/host -!/nerves/target -_nerves-tmp - -# Secret config +/node_modules +/release-* +artifacts auth_secret_test.exs auth_secret.exs - -# Farmbot artifacts -overlay -tmp/ -test_tmp/ -priv/build_calendar.so -*.o - -# Generated on crash by the VM erl_crash.dump - -# From other branches -/cache -/release-* -/node_modules -scratchpad.* - -# Various env vars. -.env - -# Fwup keys aren't stored here, but just in case. -*.priv +farmbot_ext-*.tar +farmbot_ng-*.tar +farmbot_telemetry-*.tar +log +overlay +RELEASE_NOTES run-qemu.sh +scratchpad.* +test_tmp/ +tmp/ +ttb_last_config upload.sh -*.img -artifacts -RELEASE_NOTES -# lagger can't be disabled. -/log -.make_state - -.elixir_ls -*.pem -*.db -*.db-journal -*.db-shm -*.lua -*screenlog* -*.crashdump diff --git a/CHANGELOG.md b/CHANGELOG.md index 8435a8343..04bbb7e49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +# 14.6.0 + + * Upgrade database driver. + * Convert application to a monolith. + # 14.5.0 * SSL/HTTPS configuration updates. diff --git a/Makefile b/Makefile deleted file mode 100644 index 8c2d44d1a..000000000 --- a/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -.PHONY: all clean format docs deps -.DEFAULT_GOAL: all - -MIX_ENV := $(MIX_ENV) -MIX_TARGET := $(MIX_TARGET) - -ifeq ($(MIX_ENV),) -MIX_ENV := dev -endif - -ifeq ($(MIX_TARGET),) -MIX_TARGET := host -endif - -PROJECTS := farmbot_core \ - farmbot_ext \ - farmbot_os \ - farmbot_telemetry - -all: help - -help: - @echo "Usage: " - @echo " make [target]" - @echo "TARGETS: " - @echo " clean - clean all." - -clean_other_branch: - rm -rf _build deps c_src config tmp priv - -clean: clean_other_branch - @for project in $(PROJECTS) ; do \ - echo cleaning $$project ; \ - rm -rf $$project/erl_crash.dump ; \ - rm -rf $$project/.*.sqlite3* ; \ - rm -rf $$project/*.sqlite3* ; \ - rm -rf $$project/*.db ; \ - rm -rf $$project/_build ; \ - rm -rf $$project/deps ; \ - rm -rf $$project/priv/*.so ; \ - done - -format: - mix format - @for project in $(PROJECTS) ; do \ - echo formatting $$project ; \ - cd $$project && mix format && cd .. ; \ - done - -deps: - @for project in $(PROJECTS) ; do \ - echo Fetching deps for $$project ; \ - cd $$project && mix deps.get && cd .. ; \ - done - -docs: - @for project in $(PROJECTS) ; do \ - echo Building docs for $$project ; \ - cd $$project && mix docs && cd .. ; \ - done diff --git a/VERSION b/VERSION index 2085ef5c0..0094eb4c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.5.0-rc4 +14.6.0-rc7 diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 000000000..55c6cd1b9 --- /dev/null +++ b/config/config.exs @@ -0,0 +1,54 @@ +use Mix.Config +is_test? = Mix.env() == :test +rollbar_token = System.get_env("ROLLBAR_TOKEN") + +config :exqlite, :json_library, FarmbotCore.JSON +config :farmbot, ecto_repos: [FarmbotCore.Asset.Repo] +config :logger, backends: [:console] +config :nerves, :firmware, rootfs_overlay: "rootfs_overlay" +config :tesla, adapter: Tesla.Adapter.Hackney + +%{ + Elixir.FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey => [ + ssh_handler: FarmbotCore.PublicKeyHandler.StubSSHHandler + ], + FarmbotCore.Asset.Repo => [database: "database.#{Mix.env()}.db", log: false], + FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding => [ + gpio_handler: FarmbotCore.PinBindingWorker.StubGPIOHandler + ], + FarmbotCore.BotState.FileSystem => [root_dir: "/tmp/farmbot_state"], + FarmbotCore.Celery.SysCallGlue => [sys_calls: FarmbotOS.SysCalls], + FarmbotCore.Core.CeleryScript.RunTimeWrapper => [ + celery_script_io_layer: FarmbotCore.Core.CeleryScript.StubIOLayer + ], + FarmbotCore.JSON => [json_parser: FarmbotCore.JSON.JasonParser], + FarmbotCore.Leds => [gpio_handler: FarmbotCore.Leds.StubHandler], + FarmbotExt.API.Preloader => [preloader_impl: FarmbotExt.API.Preloader.HTTP], + FarmbotExt.Time => [disable_timeouts: is_test?], + FarmbotOS.Configurator => [ + network_layer: FarmbotOS.Configurator.FakeNetworkLayer + ], + FarmbotOS.FileSystem => [data_path: "/tmp/farmbot"], + FarmbotOS.Platform.Supervisor => [ + platform_children: [FarmbotOS.Platform.Host.Configurator] + ], + FarmbotOS.System => [system_tasks: FarmbotOS.Platform.Host.SystemTasks] +} +|> Enum.map(fn {m, c} -> config :farmbot, m, c end) + +if rollbar_token && !is_test? do + config :rollbax, + access_token: rollbar_token, + environment: "production", + enable_crash_reports: true, + custom: %{fbos_version: Mix.Project.config()[:version]} +else + config :rollbax, enabled: false +end + +if Mix.target() == :host do + ok? = File.exists?("config/#{Mix.env()}.exs") + ok? && import_config("#{Mix.env()}.exs") +else + import_config("target.exs") +end diff --git a/config/dev.exs b/config/dev.exs new file mode 100644 index 000000000..6fce42de9 --- /dev/null +++ b/config/dev.exs @@ -0,0 +1,11 @@ +use Mix.Config + +data_path = Path.join(["/", "tmp", "farmbot"]) +File.mkdir_p(data_path) + +config :farmbot, data_path: data_path + +config :farmbot, FarmbotOS.Init.Supervisor, + init_children: [FarmbotOS.Platform.Host.Configurator] + +config :logger, backends: [:console] diff --git a/config/target.exs b/config/target.exs new file mode 100644 index 000000000..46cf6da6b --- /dev/null +++ b/config/target.exs @@ -0,0 +1,68 @@ +use Mix.Config +data_path = Path.join("/", "root") +local_file = Path.join(System.user_home!(), ".ssh/id_rsa.pub") +local_key = if File.exists?(local_file), do: [File.read!(local_file)], else: [] + +# TODO: If folks want reproducible builds, we will need to +# eventually fix this. +now = NaiveDateTime.utc_now() + +later = + now + |> NaiveDateTime.truncate(:second) + |> NaiveDateTime.add(60 * 60 * 24 * 365 * 3, :second) + +config :nerves_time, earliest_time: now, latest_time: later + +config :logger, backends: [RingLogger] +config :logger, RingLogger, max_size: 1024, color: [enabled: true] + +config :mdns_lite, + mdns_config: %{host: :hostname, ttl: 120}, + services: [ + %{id: :configurator, protocol: "http", transport: "tcp", port: 80}, + %{id: :ssh, protocol: "ssh", transport: "tcp", port: 22} + ] + +config :nerves_firmware_ssh, authorized_keys: local_key + +config :shoehorn, + init: [:nerves_runtime, :vintage_net, :nerves_firmware_ssh], + handler: FarmbotOS.Platform.Target.ShoehornHandler, + app: :farmbot + +config :tzdata, :autoupdate, :disabled + +config :vintage_net, + regulatory_domain: "00", + persistence: VintageNet.Persistence.Null, + config: [{"wlan0", %{type: VintageNet.Technology.Null}}] + +%{ + FarmbotCore.Asset.Repo => [database: "/root/database.#{Mix.env()}.db"], + FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding => [ + gpio_handler: FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler + ], + FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey => [ + ssh_handler: FarmbotOS.Platform.Target.SSHConsole + ], + FarmbotCore.Leds => [ + gpio_handler: FarmbotOS.Platform.Target.Leds.CircuitsHandler + ], + FarmbotOS.Configurator => [ + network_layer: FarmbotOS.Platform.Target.Configurator.VintageNetworkLayer + ], + FarmbotOS.FileSystem => [data_path: data_path], + FarmbotOS.Init.Supervisor => [ + init_children: [FarmbotOS.Platform.Target.RTCWorker] + ], + FarmbotOS.Platform.Supervisor => [ + platform_children: [ + FarmbotOS.Platform.Target.Network.Supervisor, + FarmbotOS.Platform.Target.SSHConsole, + FarmbotOS.Platform.Target.InfoWorker.Supervisor + ] + ], + FarmbotOS.System => [system_tasks: FarmbotOS.Platform.Target.SystemTasks] +} +|> Enum.map(fn {m, c} -> config :farmbot, m, c end) diff --git a/config/test.exs b/config/test.exs new file mode 100644 index 000000000..66a92f1da --- /dev/null +++ b/config/test.exs @@ -0,0 +1,29 @@ +use Mix.Config + +data_path = Path.join(["/", "tmp", "farmbot"]) +File.mkdir_p(data_path) + +config :ex_unit, capture_logs: true +config :farmbot, data_path: data_path + +config :farmbot, FarmbotCore.Celery.SysCallGlue, + sys_calls: FarmbotCore.Celery.SysCallGlue.Stubs + +config :farmbot, FarmbotOS.Configurator, + data_layer: FarmbotOS.Configurator.ConfigDataLayer, + network_layer: FarmbotOS.Configurator.FakeNetworkLayer + +config :farmbot, platform_children: [{FarmbotOS.Platform.Host.Configurator, []}] +config :plug, :validate_header_keys_during_test, true + +[ + FarmbotCore, + FarmbotCore.Config.Supervisor, + FarmbotExt, + FarmbotExt.Bootstrap.Supervisor, + FarmbotExt.DirtyWorker.Supervisor, + FarmbotExt.EagerLoader.Supervisor, + FarmbotExt.MQTT.ChannelSupervisor, + FarmbotExt.MQTT.Supervisor +] +|> Enum.map(fn mod -> config :farmbot, mod, children: [] end) diff --git a/farmbot_os/coveralls.json b/coveralls.json similarity index 100% rename from farmbot_os/coveralls.json rename to coveralls.json diff --git a/docs/celery_script/celery_script.md b/docs/celery_script/celery_script.md deleted file mode 100644 index d2e927eb4..000000000 --- a/docs/celery_script/celery_script.md +++ /dev/null @@ -1,79 +0,0 @@ -# CeleryScript - -CeleryScript is an AST definition of commands, rpcs, and functions that -can all be executed by Farmbot. The basic syntax is as follows: - -```elixir -%{ - kind: :some_command, - args: %{non_order_arg1: 1, non_order_arg2: "data"}, - body: [] -} -``` - -Note the three main fields: `kind`, `args` and `body`. -There is also another field `comment` that is optional. While technically -optional, `body` should be supplied when working with any and all modules -in this project. - -## kind - -`kind` is the identifier for a command. Examples include: - -* `move_absolute` -* `sync` -* `read_status` -* `wait` - -Each `kind` will have it's own set of rules for execution. These rules will -define what is required inside of both `args` and `body`. - -## args - -`args` is arguments to be passed to `kind`. Each `kind` defines it's own -set of optional and required `args`. Args can any of the following types: - -* `number` -* `string` (with possible enum types) -* `boolean` -* another AST. - -in the case of another AST, that AST will likely need to be evaluated before -executing the parent AST. Examples of `args` include: - -* `x` -* `y` -* `z` -* `location` -* `milliseconds` - -## body - -`body` is the only way a `list` or `array` type is aloud in CeleryScript. -It may only contain _more CeleryScript nodes_. This is useful for -enumeration, scripting looping etc. Here's a syntacticly correct example: - -```elixir -%{ - kind: :script, - args: %{}, - body: [ - %{kind: :command, args: %{x: 1}, body: []} - %{kind: :command, args: %{x: 2}, body: []} - %{kind: :command, args: %{x: 3}, body: []} - ] -} -``` - -Note there is nesting limit for CeleryScript body nodes, and nodes can -even be self referential. Example: - -```elixir -%{ - kind: :self_referencing_script, - args: %{id: 1}, - body: [ - %{kind: :execute_self_referencing_script, args: %{id: 1}, body: []} - ] -} -``` \ No newline at end of file diff --git a/docs/glossary.md b/docs/glossary.md deleted file mode 100644 index 33dfb1117..000000000 --- a/docs/glossary.md +++ /dev/null @@ -1,49 +0,0 @@ -# FarmBot OS Source Glossary - -This file contains a basic glossary of commonly used terms - -## FarmBot Specific Terms - -* Asset - REST resource stored in Farmbot's database stored on the SD card -* Arduino Firmware - The code that runs on the Arduino. - * [Source](https://github.com/farmbot/farmbot-arduino-firmware) -* CelleryScript - FarmBot OS's scripting language -* FarmbBot API/Web App - The REST server FarmBot communicates with - -## General Terms - -* Elixir - Programming language FarmBot is developed in - * [More info](https://elixir-lang.org/) - * [Docs](https://hexdocs.pm/elixir/Kernel.html) -* Erlang - Programming language and VM that Elixir compiles down too - * [More info](https://elixir-lang.org/) - * [Even more info](#OTP-Terms) - * [Docs](https://www.erlang.org/docs) -* UART - **U**niversal **A**synchronous **R**eceiver/**T**ransmitter. - hardware based transport mechanism -* SSH - **S**ecure **S**hell. -* MQTT - network protocols for pub/sub data transport -* HTTP - network protocol for accessing REST resource - -## Nerves Specific Terms - -* Nerves - Framework that allows cross compilation of Elixir code - * [More info](https://nerves-project.org/) - * [Docs](https://hexdocs.pm/nerves/getting-started.html) -* Firmware - Usually refers to the code that gets deployed onto the Raspberry Pi - -## OTP Terms - -* Beam - Virtual machine that runs compiled Erlang bytecode -* OTP - Open Telecom Platform. Erlang's runtime libraries - * [More info](https://erlang.org/doc/design_principles/des_princ.html) -* Supervisor - OTP `Process` responsible for supervising `Workers` -* Worker - OTP `Process` responsible for doing `work`. Usually `Supervised` -* Process - OTP concept responsible for sending/receiving messages. - **everything** is a process in erlang -* Application - OTP concept responsible for containing many `Supervisor`s and `Worker`s -* Distribution - OTP concept of networking multiple Beam instances together -* ETS - **E**rlang **T**erm **S**torage. OTP application for storing - data in memory -* DETS - **D**isk **E**rlang **T**erm **S**torage. OTP application for - storing data on disk diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 36f5c0cd7..000000000 --- a/docs/index.md +++ /dev/null @@ -1,61 +0,0 @@ -# FarmBot OS Documentation - -This document will act as an index to available documentation. - -## Glossary - -* [FarmBot Source Code common terms](/docs/glossary.md) - -## Cheat Sheet - -**Create a *.fw file from local repo (RPi Zero):** - -```sh -NERVES_SYSTEM=farmbot_system_rpi MIX_TARGET=rpi mix deps.get -NERVES_SYSTEM=farmbot_system_rpi MIX_TARGET=rpi mix firmware -sudo fwup farmbot_os/_build/rpi/rpi_dev/nerves/images/farmbot.fw -``` - -**Create a *.fw file from local repo (RPi v3):** - -```sh -NERVES_SYSTEM=farmbot_system_rpi3 MIX_TARGET=rpi3 mix deps.get -NERVES_SYSTEM=farmbot_system_rpi3 MIX_TARGET=rpi3 mix firmware -sudo fwup farmbot_os/_build/rpi3/rpi3_dev/nerves/images/farmbot.fw -``` - -**Create or Update the Nerves System:** - -Please see the official [Nerves documentation on "Nerves Systems"](https://hexdocs.pm/nerves/0.4.0/systems.html). - -HINT: You may want to [develop the system locally](https://stackoverflow.com/a/28189056/1064917) - -## Hardware specifics - -Most FarmBot development/testing is done on a standard desktop PC. - -* [Developing on your local PC](/docs/host_development/host_development.md) -* [Deploying on Raspberry Pi](/docs/target_development/building_target_firmware.md) - * [Provisioning OTA system](/docs/target_development/provisioning_ota_system.md) - * [Publishing Firmware (OTAs)](/docs/target_development/releasing_target_firmware.md) - * [Why doesn't my device boot after building firmware](docs/target_development/target_faq.md) - * [Inspecting a running device](/docs/target_development/consoles/target_console.md) - -## CeleryScript - -CeleryScript is FarmBot's native scripting language. See the below -documentation for information about it as it relates to FarmBot OS. - -* [CeleryScript intro](/docs/celery_script/celery_script.md) -* [A list of all supported commands](/docs/celery_script/all_nodes.md) -* [Lua (embedded scripting inside CeleryScript)](/docs/celery_script/assert_expressions.md) - -## Project structure - -The FarmBot OS application is broken into several sub applications. - -* [Project structure overview](/docs/project/structure.md) - * [farmbot_core](/docs/project/farmbot_core.md) - * [farmbot_ext](/docs/project/farmbot_ext.md) - * [farmbot_os](/docs/project/farmbot_os.md) - * [farmbot_telemetry](/docs/project/farmbot_telemetry.md) diff --git a/docs/project/farmbot_core.md b/docs/project/farmbot_core.md deleted file mode 100644 index 08bdf6a3a..000000000 --- a/docs/project/farmbot_core.md +++ /dev/null @@ -1,60 +0,0 @@ -# FarmBot Core OTP App - -`farmbot_core` is responsible for the core funcionality of the FarmBot application. -This contains things such as resource (asset) management, plugin (farmware) management, -central state, and schedule management. FarmBot specific network requests are not -made from the `farmbot_core` app. Below describes the important subsystems - -## Asset storage subsystem - -Sqlite database responsible for storing data needed for FarmBot to operate. -Most device specific REST resources are mirrored here. - -* Device -* FarmEvent -* Regimen -* Sequence -* Peripheral - -## Asset Worker subsystem - -All assets that need to have a process associated with it will be found -in this subsystem. Examples of this include: - -* FarmEvent scheduling -* Regimen scheduling -* PinBinding monitoring -* FbosConfig/FirmwareConfig - -## Farmware subsystem - -Farmbot's external plugin system. See the Farmware documentation for more details. - -## BotState subsystem - -Central in-memory state process/tracker. This process keeps a cache of -all the moving parts of FarmBot. Some examples of what is stored -in this cache: - -* Firmware reporting - current axis position - encoder data - arduino pin data - currently configured firmware parameters -* Current configuration - mirror of `fbos_config` asset -* System info - version info - (nerves) firmware info - memory usage - disk usage -* Network info - WiFi signal quality - private ip address - -## Logging subsystem - -This is where the `Messages` panel gets it's data from. Calls to this subsystem -push data into an sqlite database. This data is collected on a timer and dispatched -over MQTT when/if that subsystem is available. See [farmbot_ext](/docs/project/farmbot_ext.md) -for information on how that works. diff --git a/docs/project/farmbot_ext.md b/docs/project/farmbot_ext.md deleted file mode 100644 index 12e0b3cad..000000000 --- a/docs/project/farmbot_ext.md +++ /dev/null @@ -1,47 +0,0 @@ -# FarmBot Ext OTP App - -the `farmbot_ext` OTP app contains extended FarmbotCore functionality. -This includes mostly network functionality that isn't -possible to do in `farmbot_core`. - -## Bootstrap subsystem - -Subsystem responsible for bootstrapping a connection to the -FarmBot network services. This includes authenticating with -the FarmBot API, connecting to MQTT and syncing -the bare minimum resources to get up and running. - -## HTTP/Sync subsystem - -This is the subsystem that synchronizes FarmBot with the remote API. -It uses HTTP to download an index of all the data FarmBot cares about, -and compares timestamps to determine who has the most up to date data. -The basic flow is whoever has the most recent `updated_at` field will -become the "most truthy". If FarmBot has a more recent `updated_at` field, -FarmBot will do an HTTP PUT of it's data. If the remote resource does not -exist, FarmBot will do an HTTP POST of it's data. If the remote data has a more -recent `updated_at` field, FarmBot will do an HTTP GET and replace it's own data. - -## MQTT subsystem - -FarmBot maintains a connection to the API for real time communication. This -real time communication connection is multiplexed over multiple `channel`s. -Below is a description of the channels: - -* bot_state - pushes a JSON encoded version of the `bot_state` - process (from `farmbot_core`) -* celery_script - receives/sends JSON encoded celery_script. - Used for controlling FarmBot externally -* log - sends log messages from `farmbot_core`'s logger -* ping/pong - echos everything received. used for detecting active connection -* auto_sync - the API dispatches every REST resource change on this channel. - Used to speed up HTTP requests -* telemetry - similar to the log channel, but sends consumable events, - rather than human readable messages - -## Image uploader subsystem - -This subsystem watches a local directory, and as matching files appear in that directory, -it uploads them using the FarmBot image upload protocol. Basically an HTTP request -to fetch credentials that are used to preform another HTTP request to upload -the photo. diff --git a/docs/project/farmbot_os.md b/docs/project/farmbot_os.md deleted file mode 100644 index 198ffb38e..000000000 --- a/docs/project/farmbot_os.md +++ /dev/null @@ -1,52 +0,0 @@ -# FarmBot OTP App - -## Normal Subsystems - -the `farmbot` OTP app is the container Nerves based application. It contains mostly -glue code between all the subsystems in the other applications along with it's own -platform specific subsystems. - -### CeleryScript System Calls - -The "official" implementation of all the CeleryScript syscalls. These calls are mostly -glue to other existing implementations from the other otp apps. - -### Lua Subsystem - -The implementation of the embedded scripting language inside CeleryScript. -Also contains glue code for glueing together the real implementation to the -Lua vm. - -### Configurator Subsystem - -HTTP server responsible for configuring the running FarmBot OS instance. Will -server a web page that allows a user to supply a username, password, network credentials -etc. - -## Platform specific subsystems - -the `farmbot_os` OTP app contains target/hardware specific systems. This code is -located in the `platform` directory. - -### Network subsystem - -Responsible for getting FarmBot connected to the (inter)net. If no network -configuration is available, FarmBot will create a captive portal access -point to allow external devices to configure it. - -### GPIO subsystem - -Responsible for implementing LED and Button support at the hardware level. - -### RTC subsystem - -Responsible for syncronizing network time to an attached hardware clock. - -### Info Worker subsystem - -Responsible for simple workers that handle things like - -* CPU temperature -* CPU usage -* memory usage -* disk usage diff --git a/docs/project/farmbot_telemetry.md b/docs/project/farmbot_telemetry.md deleted file mode 100644 index 981b11d88..000000000 --- a/docs/project/farmbot_telemetry.md +++ /dev/null @@ -1,9 +0,0 @@ -# FarmBot Telemetry OTP App - -The `farmbot_telemetry` OTP application is responsible for -storage of telemetry events. Every major OTP app in the project -uses this application as a dependency. Telemetry events are -stored in a `DETS` table, and are polled occasionally -by an MQTT worker. When the events are successfully -dispatched over the network, they are removed from the -database diff --git a/docs/project/structure.md b/docs/project/structure.md deleted file mode 100644 index 8de944c23..000000000 --- a/docs/project/structure.md +++ /dev/null @@ -1,55 +0,0 @@ -# FarmBot Source Project structure - -The FarmBot OS application is broken into several sub OTP applications. - -* [farmbot_celery_script](/docs/project/farmbot_celery_script.md) -* [farmbot_core](/docs/project/farmbot_core.md) -* [farmbot_ext](/docs/project/farmbot_ext.md) -* [farmbot_os](/docs/project/farmbot_os.md) -* [farmbot_telemetry](/docs/project/farmbot_telemetry.md) - -## Generating Specific documentation - -Each project has it's own inline documentation. Documentation can be -generated by changing directory into the application of interest and -using `exdoc` to generate docs. For example for `farmbot_core`: - -```bash -cd farmbot_core -mix deps.get -mix docs -``` - -Generating docs for all projects can be done with the root level Makefile: - -```bash -make deps -make docs -``` - -## Commonality - -All of these folders share a common structure. - -```bash -$ tree $OTP_APP_ROOT -$OTP_APP_ROOT -├── lib/ -│ ├── application.ex -│ └── some_file.ex -| -├── test/ -| └── test_helper.exs -| -├── config/ -| └── config.exs -| -├─── mix.exs -└─── mix.lock - -* The `lib` folder contains Elixir source code -* the `test` folder contains Elixir scripts responsible for testing the `lib` code -* the `config` folder contains Elixir scripts responsible for - configuring the **current** OTP app -* `mix.exs` and `mix.lock` files are responsible describing - the OTP app, and managing external dependencies diff --git a/docs/target_development/building_target_firmware.md b/docs/target_development/building_target_firmware.md deleted file mode 100644 index cc1ea1890..000000000 --- a/docs/target_development/building_target_firmware.md +++ /dev/null @@ -1,128 +0,0 @@ -# Building FarmBot OS from source - -This project is written in the programming language Elixir and built using the -Nerves Project framework. - -## Cloning - -Farmbot OS now bundles and builds the [Arduino Firmware](https://github.com/farmbot/farmbot-arduino-firmware). -This is bundled as a `git` submodule. You can choose to do one of: - -```bash -git clone https://github.com/FarmBot/farmbot_os.git --recursive -``` - -or - -```bash -git clone https://github.com/FarmBot/farmbot_os.git -git submodule update --init --recursive -cd farmbot_os -``` - -To initialize the repository. - -## Before you begin - -You will need a number of things before we start: - -* A x64 bit non windows machine - * We suggest the latest OSX or Ubuntu LTS. - -## Install dependencies - -If you have the above set up you will need some software dependencies: - -* Erlang -* Elixir - * Nerves Bootstrapper found [here](https://hexdocs.pm/nerves/installation.html#Linux) -* GNU Make + GCC -* git - -## Optional dependencies - -* python -* opencv-python - -Following [this](http://embedded-elixir.com/post/2017-05-23-using-asdf-vm/) guide -will get you mostly setup. - -## Development - -Most development will be done in "host" environment. This means that rather than -making a change on your computer, then pushing it to the device, we can rapidly -develop things from the luxury of our own machine. -See [The Nerves getting started guide](https://hexdocs.pm/nerves/getting-started.html) -for more information about this. But as a side effect, we will need to be able -to configure (at least) two different environment/target combos. where: - -* `environment` - is one of: - * `prod` - The production environment. - * No developer features enabled (such as logs, local fw updates etc). - * No remote shell - * No remote firmware updates. - * Must be digitally signed. - * `dev` - The development environment. - * Logs most things to the console. - * Remote shell - * Remote firmwre updates. - * `test` - The test environment - * Only exists for running tests on the `host` target currently. -* `target` - the target this `environment` will run on. Usually one of: - * `host` - For development. - * `rpi3` - Run on Farmbot's intended hardware. - -## Feature development - -If you plan on developing features, you will probably want to develop them with -the `dev` and `host` combo. These are both the default values, -so you can simply do: - -```bash -export FARMBOT_EMAIL="email@server.com" -export FARMBOT_PASSWORD="supersecret" -export FARMBOT_SERVER="https://my.farm.bot" -export CONFIGURATOR_PORT=4000 # you should only need to do this once -mix deps.get # You should only need to do this once. -iex -S mix # This will start an interactive shell. -``` - -## Development on device - -Sometimes features will need to be developed and tested on the device itself. -This is accomplished with the `dev` and `rpi3` combo. -It is *highly* recommended that you have an FTDI cable for this such as -[this](https://www.digikey.com/product-detail/en/ftdi/TTL-232R-RPI/768-1204-ND) one - -Get deps for the rpi3 target. You should only need to do this once: - -```bash -MIX_TARGET=rpi3 mix deps.get -``` - -Produce a firmware image: - -```bash -MIX_TARGET=rpi3 mix firmware -``` - -Make sure you SDCard is plugged in before the following command: - -```bash -MIX_TARGET=rpi3 mix firmware.burn -``` - -### Local firmware updates - -If your bot is connected to your local network, you should be able to -push updates over the network to your device. - -```bash -MIX_TARGET=rpi3 mix firmware # Build a new fw. -MIX_TARGET=rpi3 mix firmware.gen.script # this should onlye be ran once -MIX_TARGET=rpi3 ./upload.sh # Push the new fw to the device. -``` - -Your device should now reboot into that new code. As long as you don't cause -a factory reset somehow, (bad init code, typo, etc) you should be able -continuously push updates to your device. diff --git a/docs/target_development/consoles/erlang_distribution.md b/docs/target_development/consoles/erlang_distribution.md deleted file mode 100644 index 41ebbd23a..000000000 --- a/docs/target_development/consoles/erlang_distribution.md +++ /dev/null @@ -1,38 +0,0 @@ -# Erlang Distribution Console - -Accessing an Erlang Distribution console - -## Setup - -No additional setup is required for setting up erlang distribution on the target. -On your `host` machine, you need to have Erlang Distribution running. This can -usually be accomplished by starting `epmd`: - -```bash -epmd --daemon -``` - -## Connecting - -From your `host` terminal, connecting to a running device can be done by using the -`remsh` feature of elixir's built in console. - -```bash -iex --name console --cookie democookie --remsh farmbot@farmbot-.local -``` - -## Disconnecting - -Issuing a `ctrl+c` to the `host` terminal should disconnect you from the session. - -# Remote Debug / Profiling of a FarmBot - -**NOTE:** Replace `farmbot-00000000a2748e33.local` with your device's real node name. - -1. On host machine, run: `iex --name me@farmbot-00000000a2748e33.local --cookie democookie` -1. An IEx session begins. -1. Run `:observer.start()` to start the observer GUI. -1. A window appears. Select `Node -> Connect Node`. -1. Enter `farmbot@farmbot-00000000a2748e33.local`. -1. The node appears in the list under the `Node` menu bar. Select it: `Node -> farmbot@DEVICE_HOSTNAME_HERE`. -1. You're ready to debug! diff --git a/docs/target_development/consoles/ssh.md b/docs/target_development/consoles/ssh.md deleted file mode 100644 index 18c34b346..000000000 --- a/docs/target_development/consoles/ssh.md +++ /dev/null @@ -1,27 +0,0 @@ -# SSH console - -Accessing an SSH console. - -## Setup - -FarmBot can be configured to start an SSH server to aid in debugging and development. -During configuration of Network, select `Advanced Settings` and paste your -[ssh public key](https://git-scm.com/book/en/v2/Git-on-the-Server-Generating-Your-SSH-Public-Key) -into the optional input section labeled: `id_rsa.pub`. -FarmBot requires a public key and will not allow a username + password combination. -If you followed the documentation described in -[building target firmware](/docs/target_development/building_target_firmware.md) -then your SSH key will be automatically added to the device. - -## Connecting - -From the same machine that owns the `id_rsa.pub` key and associated private key -you can simply `ssh `. If your machine supports `mdns`, you can also -do `ssh farmbot-` where `node_name` can be found in the `Device` panel -on the FarmBot web app. - -## Disconnecting - -To exit the SSH session, type `~.`. -This is an ssh escape sequence (See the ssh man page for other escape sequences). -Typing Ctrl+D or logoff at the IEx prompt to exit the session aren't implemented. diff --git a/docs/target_development/consoles/target_console.md b/docs/target_development/consoles/target_console.md deleted file mode 100644 index b53a66cb7..000000000 --- a/docs/target_development/consoles/target_console.md +++ /dev/null @@ -1,45 +0,0 @@ -# FarmBot target console - -The FarmBot OS target console is a repl for interacting with a running -farmbot instance. Depending on your development configuration, there are several -ways to access a console. - -If you are using `host` mode, your console will be presented on stdin of your -terminal. - -If you are on `target` mode (IE: deployed to the raspberry pi), there will -be a console available in 3 locations: - -* UART (except on RPI0 since the on-board UART is used for the arduino-firmware) - [Connect to a UART console](/docs/target_development/consoles/uart.md) -* SSH - [Connect to an SSH console](/docs/target_development/consoles/ssh.md) -* Erlang Distribution - [Connect to an Erlang Distribution console](/docs/target_development/consoles/erlang_distribution.md) - -## Console Usage - -The console a user will be presented with is _not_ a Linux console. There are -pretty much no Linux Utilities built-in. This includes but is not limited to: - -* `bash` -* `apt-get` -* `make` -* `screen` -* `vi` -* `cp` -* `mkdir` -* `ln` -* `echo` -* etc - -What is available is a console to the FarmBot OS runtime. You will need to be -familiar with the FarmBotOS Source code for this to be helpful. - -If all you are looking for is Logs, you will probably want to do: - -```elixir -RingLogger.tail() -``` - -After that command you will see logs come across the screen in real time. diff --git a/docs/target_development/consoles/uart.md b/docs/target_development/consoles/uart.md deleted file mode 100644 index 23fbe3e0d..000000000 --- a/docs/target_development/consoles/uart.md +++ /dev/null @@ -1,33 +0,0 @@ -# UART Console - -Accessing an target UART console - -## Setup - -No additional setup is required for setting up the UART console on the target. - -On your `host` machine, you need to have a console cable, as well as a console client. -The console cable must be 3.3 volts, **not** 5 volts. a 5 volt cable will harm your -Raspberry Pi. Here are some known working cables: - -* -* -* - -The most common client is probably `screen` on *Nix based -systems or `putty` on windows. See your distribution's package manager -for installation and usage instructions. - -## Connecting - -Connecting to a console is dependent on your particular client. Here is an example -`screen` command: - -```bash -screen /dev/ttyUSB0 115200 -``` - -## Disconnecting - -Disconnecting is also dependent on your particular client. To exit screen, -issue a `ctrl+\+y` sequence to escape the console. \ No newline at end of file diff --git a/docs/target_development/releasing_target_firmware.md b/docs/target_development/releasing_target_firmware.md deleted file mode 100644 index 027feba69..000000000 --- a/docs/target_development/releasing_target_firmware.md +++ /dev/null @@ -1,95 +0,0 @@ -# Publishing OTAs - -## Beta OTA channel - -Beta updates are simply tags matching the following semver string: - -``` -vMajor.Minor.Tiny-rcRC -``` - -for example: - -``` -v10.5.6-rc30 -``` - -To publish an OTA, just tag a release matching that -string. - -```bash -cd $FARMBOT_OS_ROOT_DIRECTORY -git checkout staging - -# Ensure you don't accidentally publish local changes -# that have not gone through CI: -git fetch --all -git reset --hard origin/staging - -# update the CHANGELOG, but DO NOT put the `rc` -# on the semver string. -$EDITOR CHANGELOG.md - -echo 1.2.3-rc4 > VERSION - -git add -A -git commit -am "Release v10.5.6-rc30" -git tag v1.2.3-rc4 -git push origin v1.2.3-rc4 -``` - -### NOTE about release candidate script - -the helper script only **increments** the -RC version. Calling the `release-candidate` script -from a non rc version will fail. Example: - -This will fail: - -```bash -$ cat VERSION -10.5.6 -``` - -This will succeed: - -```bash -$ cat VERSION -10.5.6-rc44 -``` - -## QA OTA channel - -Publish an OTA to the `qa` channel can be done by pushing a new branch -to github with `qa/` prefix. - -```bash -git checkout -b qa/ -git push origin qa/ -``` - -or to build a QA image from an existing branch: - -```bash -git checkout -b some-feature -git commit -am "build out some feature" -git push origin some-feature some-feature:qa/some-featuer -``` - -## Stable OTA channel - -Publish an OTA to the `stable` OTA channel can be -done by pushing anything to the main branch: - -```bash -# update VERSION -echo 11.0.1 > VERSION -# update CHANGELOG.md -$EDITOR CHANGELOG.md -git checkout -b rel-11.0.1 -git commit -am 'Release v11.0.1' -git push origin rel-11.0.1 -# open pull request -# merge pull request -# publish release once CI has completed -``` diff --git a/docs/target_development/target_faq.md b/docs/target_development/target_faq.md deleted file mode 100644 index b45f11ff7..000000000 --- a/docs/target_development/target_faq.md +++ /dev/null @@ -1,42 +0,0 @@ -# Frequently Asked Questions - -## What ports outbound does Farmbot OS use - -* MQTT: 1883 / 8883 (TLS) -* HTTP(S): 80 + 443 (this is configurable) -* NTP: UDP 123 - -## My bot doesn't boot on a fresh SD card - -This could be one of a few things. These things are in order of probability. - -* Your farmbot doesn't have enough power. You NEED a good power supply at - least 5 volts and 2.5 Amps for farmbot to boot reliably. - * Is the power LED flashing? If yes you need more amps. - * Is the Green LED flashing? If no you need more amps. -* Your Arduino wasn't detected. -* You have more than one UART device. -* You have a bad flash. - * If you used `dd` to write the image, try setting `BS` to a lower value. - * if you used win32 disk imager try safely removing the SD card -* You have a bad SD Card. -* You aren't using a Raspberry Pi 3. - -## Why can't I update my Arduino Firmware - -As of version 3.8.0 we decided to bundle the arduino firmware into farmbot os. -There was a couple reasons for this. - -* There is no more version conflicts between the firmware and operating system. -* Applying updates during farmbot os runtime can be dangerous and was leaving - peoples bot's unusable because of broken firmwares. - -## Can the shell run on HDMI? - -No. Farmbot is designed to operate without the use of a monitor. - -## Why aren't [X] or [Y] packages included - -See the above answer. [Raise an issue](https://github.com/FarmBot/farmbot_os/issues/new) -to request a package. Future versions of FarmBotOS may provide a plugin system. -It is not implemented yet. diff --git a/farmbot_core/.formatter.exs b/farmbot_core/.formatter.exs deleted file mode 100644 index 42c393dc2..000000000 --- a/farmbot_core/.formatter.exs +++ /dev/null @@ -1,19 +0,0 @@ -[ - import_deps: [:ecto], - line_length: 80, - inputs: [ - "*.{ex,exs}", - "{config,priv,test}/**/*.{ex,exs}", - "lib/bot_state/**/*.{ex,exs}", - "lib/bot_state_ng/**/*.{ex,exs}", - "lib/asset/**/*.{ex,exs}", - "lib/asset_workers/**/*.{ex,exs}", - "lib/farmware_runtime/**/*.{ex,exs}", - "lib/celery_script/**/*.{ex,exs}", - "lib/farmware_runtime.ex", - "lib/firmware/**/*.{ex,exs}", - "lib/asset*.ex", - "lib/log_storage/**/*.{ex,exs}" - ], - subdirectories: ["priv/*/migrations"] -] diff --git a/farmbot_core/.gitignore b/farmbot_core/.gitignore deleted file mode 100644 index 3a1a7064b..000000000 --- a/farmbot_core/.gitignore +++ /dev/null @@ -1,27 +0,0 @@ -# The directory Mix will write compiled artifacts to. -/_build/ - -# If you run "mix test --cover", coverage assets end up here. -/cover/ -*.coverdata - -# The directory Mix downloads your dependencies sources to. -/deps/ - -# Where 3rd-party dependencies like ExDoc output generated docs. -/doc/ - -# Ignore .fetch files in case you like to edit your project deps locally. -/.fetch - -# If the VM crashes, it generates a dump, let's ignore it too. -erl_crash.dump - -# Also ignore archive artifacts (built via "mix archive.build"). -*.ez - -# Ignore package tarball (built via "mix hex.build"). -farmbot_ng-*.tar - -*.sqlite3* -*.so diff --git a/farmbot_core/.tool-versions b/farmbot_core/.tool-versions deleted file mode 120000 index d54b92fcb..000000000 --- a/farmbot_core/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -../.tool-versions \ No newline at end of file diff --git a/farmbot_core/config/config.exs b/farmbot_core/config/config.exs deleted file mode 100644 index d64521b2a..000000000 --- a/farmbot_core/config/config.exs +++ /dev/null @@ -1,61 +0,0 @@ -use Mix.Config - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding, - gpio_handler: FarmbotCore.PinBindingWorker.StubGPIOHandler - -config :farmbot_core, - Elixir.FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey, - ssh_handler: FarmbotCore.PublicKeyHandler.StubSSHHandler - -config :farmbot_core, FarmbotCore.Leds, - gpio_handler: FarmbotCore.Leds.StubHandler - -config :farmbot_core, FarmbotCore.JSON, - json_parser: FarmbotCore.JSON.JasonParser - -config :farmbot_core, FarmbotCore.BotState.FileSystem, root_dir: "/tmp/farmbot" - -config :farmbot_core, FarmbotCore.EctoMigrator, - default_firmware_io_logs: false, - default_server: "https://my.farm.bot", - default_dns_name: "my.farm.bot", - default_ntp_server_1: "0.pool.ntp.org", - default_ntp_server_2: "1.pool.ntp.org", - default_currently_on_beta: - String.contains?( - to_string(:os.cmd('git rev-parse --abbrev-ref HEAD')), - "beta" - ) - -config :ecto, json_library: FarmbotCore.JSON - -config :farmbot_core, - ecto_repos: [ - FarmbotCore.Config.Repo, - FarmbotCore.Logger.Repo, - FarmbotCore.Asset.Repo - ] - -config :farmbot_core, FarmbotCore.Config.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: "config.#{Mix.env()}.db", - priv: "priv/config" - -config :farmbot_core, FarmbotCore.Logger.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: "logger.#{Mix.env()}.db", - priv: "priv/logger" - -config :farmbot_core, FarmbotCore.Asset.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: "asset.#{Mix.env()}.db", - priv: "priv/asset" - -config :logger, - handle_otp_reports: false, - handle_sasl_reports: false - -import_config "#{Mix.env()}.exs" diff --git a/farmbot_core/config/dev.exs b/farmbot_core/config/dev.exs deleted file mode 100644 index 7ea934c7e..000000000 --- a/farmbot_core/config/dev.exs +++ /dev/null @@ -1,4 +0,0 @@ -use Mix.Config - -config :farmbot_core, FarmbotCore.Celery.SysCalls, - sys_calls: FarmbotCore.Celery.SysCalls.Stubs diff --git a/farmbot_core/config/test.exs b/farmbot_core/config/test.exs deleted file mode 100644 index 045ac4fa8..000000000 --- a/farmbot_core/config/test.exs +++ /dev/null @@ -1,21 +0,0 @@ -use Mix.Config -config :logger, level: :debug -config :logger, :console, level: :warn - -config :farmbot_core, FarmbotCore.Celery.SysCalls, - sys_calls: FarmbotCore.Celery.SysCalls.Stubs - -if Mix.env() == :test do - config :ex_unit, capture_logs: true - mapper = fn mod -> config :farmbot_core, mod, children: [] end - - list = [ - FarmbotCore, - FarmbotCore.StorageSupervisor, - FarmbotCore.Asset.Supervisor, - FarmbotCore.BotState.Supervisor, - FarmbotCore.Config.Supervisor - ] - - Enum.map(list, mapper) -end diff --git a/farmbot_core/coveralls.json b/farmbot_core/coveralls.json deleted file mode 100644 index 0f7ba4c24..000000000 --- a/farmbot_core/coveralls.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "coverage_options": { - "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 58.0 - }, - "skip_files": [ - "test/support/test_support.ex" - ] -} diff --git a/farmbot_core/fixtures/farmware/test-farmware/run.py b/farmbot_core/fixtures/farmware/test-farmware/run.py deleted file mode 100644 index e75154b7c..000000000 --- a/farmbot_core/fixtures/farmware/test-farmware/run.py +++ /dev/null @@ -1 +0,0 @@ -print("hello world") \ No newline at end of file diff --git a/farmbot_core/lib/farmbot_core.ex b/farmbot_core/lib/farmbot_core.ex deleted file mode 100644 index e643e479b..000000000 --- a/farmbot_core/lib/farmbot_core.ex +++ /dev/null @@ -1,32 +0,0 @@ -defmodule FarmbotCore do - @moduledoc """ - Core Farmbot Services. - This includes - * Core global state management - * Data storage management - * Firmware management - * RPC and IPC management - - """ - use Application - - @doc false - def start(_, args), do: Supervisor.start_link(__MODULE__, args, name: __MODULE__) - - def init([]) do - Supervisor.init(children(), [strategy: :one_for_one]) - end - - def children do - default = [ - FarmbotCore.Leds, - FarmbotCore.EctoMigrator, - FarmbotCore.BotState.Supervisor, - FarmbotCore.StorageSupervisor, - FarmbotCore.FirmwareEstopTimer, - FarmbotCore.Celery.Scheduler - ] - config = (Application.get_env(:farmbot_ext, __MODULE__) || []) - Keyword.get(config, :children, default) - end -end diff --git a/farmbot_core/lib/farmbot_core/asset/regimen/item.ex b/farmbot_core/lib/farmbot_core/asset/regimen/item.ex deleted file mode 100644 index 74198ef91..000000000 --- a/farmbot_core/lib/farmbot_core/asset/regimen/item.ex +++ /dev/null @@ -1,30 +0,0 @@ - - defmodule FarmbotCore.Asset.Regimen.Item do - use Ecto.Schema - - import Ecto.Changeset - import FarmbotCore.Asset.View, only: [view: 2] - - @primary_key false - @behaviour FarmbotCore.Asset.View - - - view regimen_item do - %{ - time_offset: regimen_item.time_offset, - sequence_id: regimen_item.sequence_id - } - end - - embedded_schema do - field(:time_offset, :integer) - # Can't use real references here. - field(:sequence_id, :id) - end - - def changeset(item, params \\ %{}) do - item - |> cast(params, [:time_offset, :sequence_id]) - |> validate_required([]) - end - end diff --git a/farmbot_core/lib/farmbot_core/asset/supervisor.ex b/farmbot_core/lib/farmbot_core/asset/supervisor.ex deleted file mode 100644 index 54d0bc660..000000000 --- a/farmbot_core/lib/farmbot_core/asset/supervisor.ex +++ /dev/null @@ -1,48 +0,0 @@ -defmodule FarmbotCore.Asset.Supervisor do - @moduledoc false - use Supervisor - alias FarmbotCore.{AssetSupervisor, AssetMonitor} - - alias FarmbotCore.Asset.{ - Repo, - Device, - FarmEvent, - FarmwareEnv, - FarmwareInstallation, - FirstPartyFarmware, - FbosConfig, - FirmwareConfig, - PinBinding, - PublicKey, - Peripheral, - RegimenInstance - } - - def start_link(args) do - Supervisor.start_link(__MODULE__, args, name: __MODULE__) - end - - def init([]) do - Supervisor.init(children(), strategy: :one_for_one) - end - - def children do - default = [ - Repo, - {AssetSupervisor, module: FbosConfig}, - {AssetSupervisor, module: FirmwareConfig}, - {AssetSupervisor, module: Device}, - {AssetSupervisor, module: RegimenInstance}, - {AssetSupervisor, module: FarmEvent}, - {AssetSupervisor, module: PinBinding}, - {AssetSupervisor, module: PublicKey}, - {AssetSupervisor, module: Peripheral}, - {AssetSupervisor, module: FirstPartyFarmware}, - {AssetSupervisor, module: FarmwareInstallation}, - {AssetSupervisor, module: FarmwareEnv}, - AssetMonitor, - ] - config = Application.get_env(:farmbot_ext, __MODULE__) || [] - Keyword.get(config, :children, default) - end -end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex b/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex deleted file mode 100644 index 3b675bdfa..000000000 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex +++ /dev/null @@ -1,78 +0,0 @@ -defmodule FarmbotCore.FarmEventWorker.SequenceEvent do - require Logger - require FarmbotCore.Logger - alias FarmbotCore.{ - Asset, - Asset.FarmEvent, - Celery, - Celery.AST - } - use GenServer - - # Allow 'catchup' executions for ocurrences due in the past 15 minutes - # This matches Celery.Scheduler setting - @grace_period_s 900 - - @impl GenServer - def init([farm_event, args]) do - send self(), :schedule - {:ok, %{farm_event: farm_event, args: args, scheduled: 0, timesync_waits: 0}} - end - - @impl GenServer - def handle_info(:schedule, state) do - unless NervesTime.synchronized? do - {:noreply, %{state | timesync_waits: state.timesync_waits + 1}, 3_000} - else - base_time = DateTime.add(DateTime.utc_now(), 0 - @grace_period_s) - farm_event = state.farm_event - - occurrences = - farm_event - |> FarmEvent.build_calendar(base_time) - # get rid of any item that has already been scheduled/executed - |> Enum.reject(fn(scheduled_at) -> - Asset.get_farm_event_execution(farm_event, scheduled_at) - end) - occurrences - |> Enum.each(fn(at) -> - schedule_sequence(farm_event, at) - end) - {:noreply, %{state | scheduled: state.scheduled + length(occurrences)}} - end - end - - def handle_info(:timeout, state) do - Process.send_after(self(), :schedule, 1_000) - {:noreply, state} - end - - def handle_info({Celery, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do - status = case result do - :ok -> "ok" - {:error, reason} -> - FarmbotCore.Logger.error(2, "Event scheduled at #{scheduled_at} failed to execute: #{reason}") - reason - end - _ = Asset.add_execution_to_farm_event!(state.farm_event, %{ - scheduled_at: scheduled_at, - executed_at: executed_at, - status: status - }) - {:noreply, state} - end - - def schedule_sequence(farm_event, at) do - sequence = Asset.get_sequence(farm_event.executable_id) - sequence || raise("Sequence #{farm_event.executable_id} is not synced") - param_appls = AST.decode(farm_event.body) - celery_ast = AST.decode(sequence) - celery_args = - celery_ast.args - |> Map.put(:sequence_name, sequence.name) - |> Map.put(:locals, %{celery_ast.args.locals | body: celery_ast.args.locals.body ++ param_appls}) - - celery_ast = %{celery_ast | args: celery_args} - Celery.schedule(celery_ast, at, farm_event) - end -end diff --git a/farmbot_core/lib/farmbot_core/bot_state/supervisor.ex b/farmbot_core/lib/farmbot_core/bot_state/supervisor.ex deleted file mode 100644 index 0f505928a..000000000 --- a/farmbot_core/lib/farmbot_core/bot_state/supervisor.ex +++ /dev/null @@ -1,21 +0,0 @@ -defmodule FarmbotCore.BotState.Supervisor do - use Supervisor - - def start_link(args) do - Supervisor.start_link(__MODULE__, args, [name: __MODULE__]) - end - - def init([]) do - Supervisor.init(children(), [strategy: :one_for_all]) - end - - def children do - default = [ - FarmbotCore.BotState, - FarmbotCore.BotState.FileSystem, - FarmbotCore.BotState.SchedulerUsageReporter - ] - config = Application.get_env(:farmbot_ext, __MODULE__) || [] - Keyword.get(config, :children, default) - end -end diff --git a/farmbot_core/lib/farmbot_core/config_storage/migration_helpers.ex b/farmbot_core/lib/farmbot_core/config_storage/migration_helpers.ex deleted file mode 100644 index 847e1c594..000000000 --- a/farmbot_core/lib/farmbot_core/config_storage/migration_helpers.ex +++ /dev/null @@ -1,62 +0,0 @@ -defmodule FarmbotCore.Config.MigrationHelpers do - @moduledoc false - - # This is pretty bad practice, but i don't plan on really changing it at all. - - alias FarmbotCore.Config - alias Config.{Repo, Config, StringValue, BoolValue, FloatValue} - import Ecto.Query - - @auth_group_id 1 - @hw_param_group_id 2 - @settings_group_id 3 - - def create_auth_config(key, type, value) when type in [:string, :float, :bool] do - create_value(type_to_mod(type), value) - |> create_config(@auth_group_id, key) - end - - def create_settings_config(key, type, value) when type in [:string, :float, :bool] do - create_value(type_to_mod(type), value) - |> create_config(@settings_group_id, key) - end - - def delete_settings_config(key, type) when type in [:string, :float, :bool] do - conf = Repo.one!(from c in Config, where: c.group_id == @settings_group_id and c.key == ^key) - val_id = Map.fetch!(conf, :"#{type}_value_id") - val = Repo.one!(from t in type_to_mod(type), where: t.id == ^val_id) - Repo.delete!(conf) - Repo.delete!(val) - :ok - end - - def create_hw_param(key) when is_binary(key) do - create_value(FloatValue, nil) |> create_config(@hw_param_group_id, key) - end - - defp type_to_mod(:string), do: StringValue - defp type_to_mod(:float), do: FloatValue - defp type_to_mod(:bool), do: BoolValue - - def create_config(value, group_id, key) do - %Config{group_id: group_id, key: key} - |> Map.put( - :"#{Module.split(value.__struct__) |> List.last() |> Macro.underscore()}_id", - value.id - ) - |> Config.changeset() - |> Repo.insert!() - end - - def create_value(type, val \\ nil) do - unless Code.ensure_loaded?(type) do - raise "Unknown type: #{type}" - end - - type - |> struct() - |> Map.put(:value, val) - |> type.changeset() - |> Repo.insert!() - end -end diff --git a/farmbot_core/lib/farmbot_core/config_storage/repo.ex b/farmbot_core/lib/farmbot_core/config_storage/repo.ex deleted file mode 100644 index 20406a4ba..000000000 --- a/farmbot_core/lib/farmbot_core/config_storage/repo.ex +++ /dev/null @@ -1,5 +0,0 @@ -defmodule FarmbotCore.Config.Repo do - @moduledoc "Repo for storing config data." - use Ecto.Repo, otp_app: :farmbot_core, - adapter: Application.get_env(:farmbot_core, __MODULE__)[:adapter] -end diff --git a/farmbot_core/lib/farmbot_core/config_storage/supervisor.ex b/farmbot_core/lib/farmbot_core/config_storage/supervisor.ex deleted file mode 100644 index e7cf0c18a..000000000 --- a/farmbot_core/lib/farmbot_core/config_storage/supervisor.ex +++ /dev/null @@ -1,18 +0,0 @@ -defmodule FarmbotCore.Config.Supervisor do - @moduledoc false - use Supervisor - - def start_link(args) do - Supervisor.start_link(__MODULE__, args, [name: __MODULE__]) - end - - def init([]) do - Supervisor.init(children(), strategy: :one_for_one) - end - - def children do - default = [ {FarmbotCore.Config.Repo, []} ] - config = Application.get_env(:farmbot_ext, __MODULE__) || [] - Keyword.get(config, :children, default) - end -end diff --git a/farmbot_core/lib/farmbot_core/ecto_migrator.ex b/farmbot_core/lib/farmbot_core/ecto_migrator.ex deleted file mode 100644 index 03fe57b41..000000000 --- a/farmbot_core/lib/farmbot_core/ecto_migrator.ex +++ /dev/null @@ -1,73 +0,0 @@ -defmodule FarmbotCore.EctoMigrator do - def child_spec(_opts) do - %{ - id: __MODULE__, - start: {__MODULE__, :migrate, []}, - type: :worker, - restart: :transient, - shutdown: 500 - } - end - - @doc "Replacement for Mix.Tasks.Ecto.Migrate" - def migrate do - repos = Application.get_env(:farmbot_core, :ecto_repos) - for repo <- repos, do: migrate(repo) - :ignore - end - - def migrate(FarmbotCore.Asset.Repo) do - migrate(FarmbotCore.Asset.Repo, Path.join([:code.priv_dir(:farmbot_core), "asset", "migrations"])) - end - - def migrate(FarmbotCore.Logger.Repo) do - migrate(FarmbotCore.Logger.Repo, Path.join([:code.priv_dir(:farmbot_core), "logger", "migrations"])) - end - - def migrate(FarmbotCore.Config.Repo) do - migrate(FarmbotCore.Config.Repo, Path.join([:code.priv_dir(:farmbot_core), "config", "migrations"])) - end - - def migrate(repo, migrations_path) do - opts = [all: true] - {:ok, pid, apps} = Mix.Ecto.ensure_started(repo, opts) - - migrator = &Ecto.Migrator.run/4 - # HERE: - migrated = migrator.(repo, migrations_path, :up, opts) - pid && repo.stop(pid) - restart_apps_if_migrated(apps, migrated) - Process.sleep(500) - end - - # Pulled this out of Ecto because Ecto's version - # messes with Logger config - def restart_apps_if_migrated(_, []), do: :ok - - def restart_apps_if_migrated(apps, [_|_]) do - for app <- Enum.reverse(apps) do - Application.stop(app) - end - for app <- apps do - Application.ensure_all_started(app) - end - :ok - end - - @doc "Replacement for Mix.Tasks.Ecto.Drop" - def drop do - repos = Application.get_env(:farmbot_core, :ecto_repos) - - for repo <- repos do - case drop(repo) do - :ok -> :ok - {:error, :already_down} -> :ok - {:error, reason} -> raise reason - end - end - end - - def drop(repo) do - repo.__adapter__.storage_down(repo.config) - end -end diff --git a/farmbot_core/lib/farmbot_core/leds/leds.ex b/farmbot_core/lib/farmbot_core/leds/leds.ex deleted file mode 100644 index 437fc2161..000000000 --- a/farmbot_core/lib/farmbot_core/leds/leds.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule FarmbotCore.Leds do - @moduledoc "API for controling Farmbot LEDS." - - @valid_status [:off, :solid, :slow_blink, :fast_blink, :really_fast_blink] - - def red(status) when status in @valid_status, do: led_handler().red(status) - def blue(status) when status in @valid_status, do: led_handler().blue(status) - def green(status) when status in @valid_status, do: led_handler().green(status) - def yellow(status) when status in @valid_status, do: led_handler().yellow(status) - def white1(status) when status in @valid_status, do: led_handler().white1(status) - def white2(status) when status in @valid_status, do: led_handler().white2(status) - def white3(status) when status in @valid_status, do: led_handler().white3(status) - def white4(status) when status in @valid_status, do: led_handler().white4(status) - def white5(status) when status in @valid_status, do: led_handler().white5(status) - - def led_handler, - do: Application.get_env(:farmbot_core, __MODULE__)[:gpio_handler] - - def child_spec(opts) do - %{ - id: __MODULE__, - start: {led_handler(), :start_link, [opts]}, - type: :worker, - restart: :permanent, - shutdown: 500 - } - end -end diff --git a/farmbot_core/lib/farmbot_core/log_storage/repo.ex b/farmbot_core/lib/farmbot_core/log_storage/repo.ex deleted file mode 100644 index a8c3a308a..000000000 --- a/farmbot_core/lib/farmbot_core/log_storage/repo.ex +++ /dev/null @@ -1,6 +0,0 @@ -defmodule FarmbotCore.Logger.Repo do - @moduledoc "Repo for storing logs." - use Ecto.Repo, - otp_app: :farmbot_core, - adapter: Application.get_env(:farmbot_core, __MODULE__)[:adapter] -end diff --git a/farmbot_core/lib/farmbot_core/log_storage/supervisor.ex b/farmbot_core/lib/farmbot_core/log_storage/supervisor.ex deleted file mode 100644 index 9108415a7..000000000 --- a/farmbot_core/lib/farmbot_core/log_storage/supervisor.ex +++ /dev/null @@ -1,13 +0,0 @@ -defmodule FarmbotCore.Logger.Supervisor do - @moduledoc false - use Supervisor - - def start_link(args) do - Supervisor.start_link(__MODULE__, args, name: __MODULE__) - end - - def init([]) do - opts = [strategy: :one_for_all] - Supervisor.init([FarmbotCore.Logger.Repo], opts) - end -end diff --git a/farmbot_core/lib/farmbot_core/storage_supervisor.ex b/farmbot_core/lib/farmbot_core/storage_supervisor.ex deleted file mode 100644 index 31c789f00..000000000 --- a/farmbot_core/lib/farmbot_core/storage_supervisor.ex +++ /dev/null @@ -1,26 +0,0 @@ -defmodule FarmbotCore.StorageSupervisor do - @moduledoc """ - Top-level supervisor for REST resources (Asset), configs and the logger. - """ - - use Supervisor - - def start_link(args) do - Supervisor.start_link(__MODULE__, args, [name: __MODULE__]) - end - - def init([]) do - Supervisor.init(children(), [strategy: :one_for_one]) - end - - def children do - default = [ - FarmbotCore.Logger.Supervisor, - FarmbotCore.Config.Supervisor, - FarmbotCore.Asset.Supervisor, - FarmbotCore.Firmware.UARTObserver, - ] - config = Application.get_env(:farmbot_ext, __MODULE__) || [] - Keyword.get(config, :children, default) - end -end diff --git a/farmbot_core/mix.exs b/farmbot_core/mix.exs deleted file mode 100644 index 69257fef2..000000000 --- a/farmbot_core/mix.exs +++ /dev/null @@ -1,92 +0,0 @@ -defmodule FarmbotCore.MixProject do - use Mix.Project - @target System.get_env("MIX_TARGET") || "host" - @version Path.join([__DIR__, "..", "VERSION"]) - |> File.read!() - |> String.trim() - @branch System.cmd("git", ~w"rev-parse --abbrev-ref HEAD") - |> elem(0) - |> String.trim() - # @elixir_version Path.join([__DIR__, "..", "ELIXIR_VERSION"]) - # |> File.read!() - # |> String.trim() - - defp commit do - System.cmd("git", ~w"rev-parse --verify HEAD") |> elem(0) |> String.trim() - end - - def project do - [ - app: :farmbot_core, - description: "The Brains of the Farmbot Project", - # elixir: @elixir_version, - elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], - compilers: Mix.compilers(), - elixirc_paths: elixirc_paths(Mix.env()), - version: @version, - target: @target, - branch: @branch, - commit: commit(), - build_embedded: false, - start_permanent: Mix.env() == :prod, - aliases: aliases(), - deps: deps(), - test_coverage: [tool: ExCoveralls], - preferred_cli_env: [ - coveralls: :test, - "coveralls.detail": :test, - "coveralls.post": :test, - "coveralls.html": :test - ], - source_url: "https://github.com/Farmbot/farmbot_os", - homepage_url: "http://farmbot.io", - docs: [ - logo: "../farmbot_os/priv/static/farmbot_logo.png", - extras: Path.wildcard("../docs/**/*.md") - ] - ] - end - - # Run "mix help compile.app" to learn about applications. - def application do - [ - extra_applications: [:logger, :inets, :runtime_tools, :ssh], - mod: {FarmbotCore, []} - ] - end - - # Run "mix help deps" to learn about dependencies. - defp deps do - [ - {:circuits_uart, "~> 1.4"}, - {:ex_doc, "~> 0.25", only: [:dev], targets: [:host], runtime: false}, - {:excoveralls, "~> 0.14", only: [:test], targets: [:host]}, - {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:jason, "~> 1.2"}, - {:mimic, "~> 1.5", only: :test}, - {:muontrap, "~> 0.6"}, - {:nerves_time, "~> 0.4.3"}, - {:sqlite_ecto2, "2.3.1"}, - {:timex, "~> 3.7"} - ] - end - - defp elixirc_paths(:test) do - ["lib", Path.expand("../test/support")] - end - - defp elixirc_paths(:dev) do - ["lib", Path.expand("../test/support")] - end - - defp elixirc_paths(_), do: ["lib"] - - defp aliases, - do: [ - test: [ - "ecto.drop", - "ecto.migrate", - "test" - ] - ] -end diff --git a/farmbot_core/mix.lock b/farmbot_core/mix.lock deleted file mode 100644 index 173f34048..000000000 --- a/farmbot_core/mix.lock +++ /dev/null @@ -1,51 +0,0 @@ -%{ - "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, - "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, - "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, - "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, - "cowboy": {:hex, :cowboy, "2.5.0", "4ef3ae066ee10fe01ea3272edc8f024347a0d3eb95f6fbb9aed556dacbfc1337", [:rebar3], [{:cowlib, "~> 2.6.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.6.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, - "cowlib": {:hex, :cowlib, "2.6.0", "8aa629f81a0fc189f261dc98a42243fa842625feea3c7ec56c48f4ccdb55490f", [:rebar3], [], "hexpm"}, - "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "5f0a16a58312a610d5eb0b07506280c65f5137868ad479045f2a2dc4ced80550"}, - "decimal": {:hex, :decimal, "1.9.0", "83e8daf59631d632b171faabafb4a9f4242c514b0a06ba3df493951c08f64d07", [:mix], [], "hexpm", "b1f2343568eed6928f3e751cf2dffde95bfaa19dd95d09e8a9ea92ccfd6f7d85"}, - "dialyxir": {:hex, :dialyxir, "1.0.0-rc.3", "774306f84973fc3f1e2e8743eeaa5f5d29b117f3916e5de74c075c02f1b8ef55", [:mix], [], "hexpm", "ddde98a783cec47d1b0ffaf5a0d5fbe09e90e1ac2d28452eefa6f72aac072c5a"}, - "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, - "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "f1e20ddf41713b4db247443a3bea9045c4103b27c0e64b0c21ec50edde51fba8"}, - "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, - "esqlite": {:hex, :esqlite, "0.4.1", "ba5d0bab6b9c8432ffe1bf12fee8e154a50f1c3c40eadc3a9c870c23ca94d961", [:rebar3], [], "hexpm", "3584ca33172f4815ce56e96eed9835f5d8c987a9000fbc8c376c86acef8bf965"}, - "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, - "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, - "gen_stage": {:hex, :gen_stage, "0.14.1", "9d46723fda072d4f4bb31a102560013f7960f5d80ea44dcb96fd6304ed61e7a4", [:mix], [], "hexpm"}, - "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, - "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, - "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.3.0", "5e8d45a39e95c650900d03f897fbf99ae04f60ab1daa4a34c7a20a5151b7a5fe", [:mix], [], "hexpm"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "mimic": {:hex, :mimic, "1.5.1", "085f7ebfeb5b579a13a167aec3c712d71fecfc6cb8b298c0dd3056f97ea2c2a0", [:mix], [], "hexpm", "33a50ef9ff38f8f24b2586d52e529981a3ba2b8d061c872084aff0e993bf4bd5"}, - "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, - "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, - "nerves_uart": {:hex, :nerves_uart, "1.2.0", "195424116b925cd3bf9d666be036c2a80655e6ca0f8d447e277667a60005c50e", [:mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "plug": {:hex, :plug, "1.7.1", "8516d565fb84a6a8b2ca722e74e2cd25ca0fc9d64f364ec9dbec09d33eb78ccd", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}], "hexpm"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.0.0", "ab0c92728f2ba43c544cce85f0f220d8d30fc0c90eaa1e6203683ab039655062", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"}, - "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"}, - "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"}, - "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, - "ranch": {:hex, :ranch, "1.6.2", "6db93c78f411ee033dbb18ba8234c5574883acb9a75af0fb90a9b82ea46afa00", [:rebar3], [], "hexpm"}, - "ring_logger": {:hex, :ring_logger, "0.4.1", "db972365bfda705288d7629e80af5704a1aafdbe9da842712c3cdd587639c72e", [:mix], [], "hexpm"}, - "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm", "ba952bfa35b374e1e5d84bc5f5efe8360c6f99dc93b3118f714a9a2dff6c9e19"}, - "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm", "a588e8e4ab9570c32a03605fabff86f0fee1040530d33edc4fc4392db4d81700"}, - "sqlitex": {:hex, :sqlitex, "1.7.1", "022d477aab2ae999c43ae6fbd1782ff1457e0e95c251c7b5fa6f7b7b102040ff", [:mix], [{:decimal, "~> 1.7", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm", "ef16cda37b151136a47a6c0830dc9eb5e5f8f5f029b649e9f3a58a6eed634b80"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, - "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, - "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, - "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, -} diff --git a/farmbot_core/priv/asset/migrations/20181017210730_create_local_metas_table.exs b/farmbot_core/priv/asset/migrations/20181017210730_create_local_metas_table.exs deleted file mode 100644 index a5abedaed..000000000 --- a/farmbot_core/priv/asset/migrations/20181017210730_create_local_metas_table.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateLocalMetasTable do - use Ecto.Migration - - def change do - create table("local_metas") do - add(:status, :string) - add(:table, :string) - add(:monitor, :boolean, default: true) - add(:asset_local_id, :binary_id) - end - - create(unique_index("local_metas", [:table, :asset_local_id])) - end -end diff --git a/farmbot_core/priv/asset/migrations/20181017210735_create_devices_table.exs b/farmbot_core/priv/asset/migrations/20181017210735_create_devices_table.exs deleted file mode 100644 index 97541cb88..000000000 --- a/farmbot_core/priv/asset/migrations/20181017210735_create_devices_table.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateDevicesTable do - use Ecto.Migration - - def change do - create table("devices", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:name, :string) - add(:timezone, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181017223659_create_tools_table.exs b/farmbot_core/priv/asset/migrations/20181017223659_create_tools_table.exs deleted file mode 100644 index 4025a5bc6..000000000 --- a/farmbot_core/priv/asset/migrations/20181017223659_create_tools_table.exs +++ /dev/null @@ -1,13 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateToolsTable do - use Ecto.Migration - - def change do - create table("tools", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:name, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181017225445_create_peripherals_table.exs b/farmbot_core/priv/asset/migrations/20181017225445_create_peripherals_table.exs deleted file mode 100644 index b2765cc84..000000000 --- a/farmbot_core/priv/asset/migrations/20181017225445_create_peripherals_table.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreatePeripheralsTable do - use Ecto.Migration - - def change do - create table("peripherals", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:pin, :integer) - add(:mode, :integer) - add(:label, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181017230326_create_sensors_table.exs b/farmbot_core/priv/asset/migrations/20181017230326_create_sensors_table.exs deleted file mode 100644 index cadc6e80c..000000000 --- a/farmbot_core/priv/asset/migrations/20181017230326_create_sensors_table.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateSensorsTable do - use Ecto.Migration - - def change do - create table("sensors", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:pin, :integer) - add(:mode, :integer) - add(:label, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181017230333_create_sensor_readings_table.exs b/farmbot_core/priv/asset/migrations/20181017230333_create_sensor_readings_table.exs deleted file mode 100644 index 5262e7dd4..000000000 --- a/farmbot_core/priv/asset/migrations/20181017230333_create_sensor_readings_table.exs +++ /dev/null @@ -1,18 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateSensorReadingsTable do - use Ecto.Migration - - def change do - create table("sensor_readings", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:mode, :integer) - add(:pin, :integer) - add(:value, :integer) - add(:x, :float) - add(:y, :float) - add(:z, :float) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181018005030_create_sequences_table.exs b/farmbot_core/priv/asset/migrations/20181018005030_create_sequences_table.exs deleted file mode 100644 index 240c45849..000000000 --- a/farmbot_core/priv/asset/migrations/20181018005030_create_sequences_table.exs +++ /dev/null @@ -1,16 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateSequencesTable do - use Ecto.Migration - - def change do - create table("sequences", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:name, :string) - add(:kind, :string) - add(:args, :map) - add(:body, {:array, :map}) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181018022229_create_regimens_table.exs b/farmbot_core/priv/asset/migrations/20181018022229_create_regimens_table.exs deleted file mode 100644 index 3a3ecbe2c..000000000 --- a/farmbot_core/priv/asset/migrations/20181018022229_create_regimens_table.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateRegimensTable do - use Ecto.Migration - - def change do - create table("regimens", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:regimen_items, {:array, :map}) - add(:name, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181018040229_create_pin_bindings_table.exs b/farmbot_core/priv/asset/migrations/20181018040229_create_pin_bindings_table.exs deleted file mode 100644 index dfcd6502f..000000000 --- a/farmbot_core/priv/asset/migrations/20181018040229_create_pin_bindings_table.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreatePinBindingsTable do - use Ecto.Migration - - def change do - create table("pin_bindings", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:pin_num, :integer) - add(:sequence_id, :integer) - add(:special_action, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019165701_create_points_table.exs b/farmbot_core/priv/asset/migrations/20181019165701_create_points_table.exs deleted file mode 100644 index 0061e8835..000000000 --- a/farmbot_core/priv/asset/migrations/20181019165701_create_points_table.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreatePointsTable do - use Ecto.Migration - - def change do - create table("points", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:meta, :map) - add(:name, :string) - add(:plant_stage, :string) - add(:planted_at, :utc_datetime) - add(:pointer_type, :string) - add(:radius, :float) - add(:x, :float) - add(:y, :float) - add(:z, :float) - add(:tool_id, :integer) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019172740_create_farm_events_table.exs b/farmbot_core/priv/asset/migrations/20181019172740_create_farm_events_table.exs deleted file mode 100644 index 5d5e35824..000000000 --- a/farmbot_core/priv/asset/migrations/20181019172740_create_farm_events_table.exs +++ /dev/null @@ -1,19 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateFarmEventsTable do - use Ecto.Migration - - def change do - create table("farm_events", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:end_time, :utc_datetime) - add(:executable_type, :string) - add(:executable_id, :id) - add(:repeat, :integer) - add(:start_time, :utc_datetime) - add(:time_unit, :string) - add(:last_executed, :utc_datetime) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019180739_create_firmware_configs_table.exs b/farmbot_core/priv/asset/migrations/20181019180739_create_firmware_configs_table.exs deleted file mode 100644 index 55c4241fc..000000000 --- a/farmbot_core/priv/asset/migrations/20181019180739_create_firmware_configs_table.exs +++ /dev/null @@ -1,100 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateFirmwareConfigsTable do - use Ecto.Migration - - def change do - create table("firmware_configs", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:pin_guard_4_time_out, :float) - add(:pin_guard_1_active_state, :float) - add(:encoder_scaling_y, :float) - add(:movement_invert_2_endpoints_x, :float) - add(:movement_min_spd_y, :float) - add(:pin_guard_2_time_out, :float) - add(:movement_timeout_y, :float) - add(:movement_home_at_boot_y, :float) - add(:movement_home_spd_z, :float) - add(:movement_invert_endpoints_z, :float) - add(:pin_guard_1_pin_nr, :float) - add(:movement_invert_endpoints_y, :float) - add(:movement_max_spd_y, :float) - add(:movement_home_up_y, :float) - add(:encoder_missed_steps_decay_z, :float) - add(:movement_home_spd_y, :float) - add(:encoder_use_for_pos_x, :float) - add(:movement_step_per_mm_x, :float) - add(:movement_home_at_boot_z, :float) - add(:movement_steps_acc_dec_z, :float) - add(:pin_guard_5_pin_nr, :float) - add(:movement_invert_motor_z, :float) - add(:movement_max_spd_x, :float) - add(:movement_enable_endpoints_y, :float) - add(:movement_enable_endpoints_z, :float) - add(:movement_stop_at_home_x, :float) - add(:movement_axis_nr_steps_y, :float) - add(:pin_guard_1_time_out, :float) - add(:movement_home_at_boot_x, :float) - add(:pin_guard_2_pin_nr, :float) - add(:encoder_scaling_z, :float) - add(:param_e_stop_on_mov_err, :float) - add(:encoder_enabled_x, :float) - add(:pin_guard_2_active_state, :float) - add(:encoder_missed_steps_decay_y, :float) - add(:movement_home_up_z, :float) - add(:movement_enable_endpoints_x, :float) - add(:movement_step_per_mm_y, :float) - add(:pin_guard_3_pin_nr, :float) - add(:param_mov_nr_retry, :float) - add(:movement_stop_at_home_z, :float) - add(:pin_guard_4_active_state, :float) - add(:movement_steps_acc_dec_y, :float) - add(:movement_home_spd_x, :float) - add(:movement_keep_active_x, :float) - add(:pin_guard_3_time_out, :float) - add(:movement_keep_active_y, :float) - add(:encoder_scaling_x, :float) - add(:movement_invert_2_endpoints_z, :float) - add(:encoder_missed_steps_decay_x, :float) - add(:movement_timeout_z, :float) - add(:encoder_missed_steps_max_z, :float) - add(:movement_min_spd_z, :float) - add(:encoder_enabled_y, :float) - add(:encoder_type_y, :float) - add(:movement_home_up_x, :float) - add(:pin_guard_3_active_state, :float) - add(:movement_invert_motor_x, :float) - add(:movement_keep_active_z, :float) - add(:movement_max_spd_z, :float) - add(:movement_secondary_motor_invert_x, :float) - add(:movement_stop_at_max_x, :float) - add(:movement_steps_acc_dec_x, :float) - add(:pin_guard_4_pin_nr, :float) - add(:encoder_type_x, :float) - add(:movement_invert_2_endpoints_y, :float) - add(:encoder_invert_y, :float) - add(:movement_axis_nr_steps_x, :float) - add(:movement_stop_at_max_z, :float) - add(:movement_invert_endpoints_x, :float) - add(:encoder_invert_z, :float) - add(:encoder_use_for_pos_z, :float) - add(:pin_guard_5_active_state, :float) - add(:movement_step_per_mm_z, :float) - add(:encoder_enabled_z, :float) - add(:movement_secondary_motor_x, :float) - add(:pin_guard_5_time_out, :float) - add(:movement_min_spd_x, :float) - add(:encoder_type_z, :float) - add(:movement_stop_at_max_y, :float) - add(:encoder_use_for_pos_y, :float) - add(:encoder_missed_steps_max_y, :float) - add(:movement_timeout_x, :float) - add(:movement_stop_at_home_y, :float) - add(:movement_axis_nr_steps_z, :float) - add(:encoder_invert_x, :float) - add(:encoder_missed_steps_max_x, :float) - add(:movement_invert_motor_y, :float) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019180816_create_fbos_configs_table.exs b/farmbot_core/priv/asset/migrations/20181019180816_create_fbos_configs_table.exs deleted file mode 100644 index bfd13a3f0..000000000 --- a/farmbot_core/priv/asset/migrations/20181019180816_create_fbos_configs_table.exs +++ /dev/null @@ -1,26 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateFbosConfigsTable do - use Ecto.Migration - - def change do - create table("fbos_configs", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:arduino_debug_messages, :boolean) - add(:auto_sync, :boolean) - add(:beta_opt_in, :boolean) - add(:disable_factory_reset, :boolean) - add(:firmware_hardware, :string) - add(:firmware_path, :string) - add(:firmware_input_log, :boolean) - add(:firmware_output_log, :boolean) - add(:firmware_debug_log, :boolean) - add(:network_not_found_timer, :integer) - add(:os_auto_update, :boolean) - add(:sequence_body_log, :boolean) - add(:sequence_complete_log, :boolean) - add(:sequence_init_log, :boolean) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019180911_create_farmware_installations_table.exs b/farmbot_core/priv/asset/migrations/20181019180911_create_farmware_installations_table.exs deleted file mode 100644 index a00a7b947..000000000 --- a/farmbot_core/priv/asset/migrations/20181019180911_create_farmware_installations_table.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateFarmwareInstallationsTable do - use Ecto.Migration - - def change do - create table("farmware_installations", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:url, :string) - add(:manifest, :map) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019180925_create_farmware_envs_table.exs b/farmbot_core/priv/asset/migrations/20181019180925_create_farmware_envs_table.exs deleted file mode 100644 index bba454e04..000000000 --- a/farmbot_core/priv/asset/migrations/20181019180925_create_farmware_envs_table.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateFarmwareEnvsTable do - use Ecto.Migration - - def change do - create table("farmware_envs", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:key, :string) - add(:value, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019180955_create_diagnostic_dumps_table.exs b/farmbot_core/priv/asset/migrations/20181019180955_create_diagnostic_dumps_table.exs deleted file mode 100644 index e121f08b9..000000000 --- a/farmbot_core/priv/asset/migrations/20181019180955_create_diagnostic_dumps_table.exs +++ /dev/null @@ -1,19 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateDiagnosticDumpsTable do - use Ecto.Migration - - def change do - create table("diagnostic_dumps", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:ticket_identifier, :string) - add(:fbos_commit, :string) - add(:fbos_version, :string) - add(:firmware_commit, :string) - add(:firmware_state, :string) - add(:network_interface, :string) - add(:fbos_dmesg_dump, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181019181000_create_device_certs_table.exs b/farmbot_core/priv/asset/migrations/20181019181000_create_device_certs_table.exs deleted file mode 100644 index 8d61a443c..000000000 --- a/farmbot_core/priv/asset/migrations/20181019181000_create_device_certs_table.exs +++ /dev/null @@ -1,13 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateDeviceCertsTable do - use Ecto.Migration - - def change do - create table("device_certs", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:serial_number, :string) - add(:tags, {:array, :string}) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181022002449_create_syncs_table.exs b/farmbot_core/priv/asset/migrations/20181022002449_create_syncs_table.exs deleted file mode 100644 index 915e7b8e4..000000000 --- a/farmbot_core/priv/asset/migrations/20181022002449_create_syncs_table.exs +++ /dev/null @@ -1,27 +0,0 @@ -defmodule Elixir.FarmbotCore.Asset.Repo.Migrations.CreateSyncsTable do - use Ecto.Migration - - def change do - create table("syncs", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:devices, {:array, :map}) - add(:diagnostic_dumps, {:array, :map}) - add(:farm_events, {:array, :map}) - add(:farmware_envs, {:array, :map}) - add(:farmware_installations, {:array, :map}) - add(:fbos_configs, {:array, :map}) - add(:firmware_configs, {:array, :map}) - add(:peripherals, {:array, :map}) - add(:pin_bindings, {:array, :map}) - add(:points, {:array, :map}) - add(:regimens, {:array, :map}) - add(:sensor_readings, {:array, :map}) - add(:sensors, {:array, :map}) - add(:sequences, {:array, :map}) - add(:tools, {:array, :map}) - add(:now, :utc_datetime) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20181022002450_create_persistent_regimens_table.exs b/farmbot_core/priv/asset/migrations/20181022002450_create_persistent_regimens_table.exs deleted file mode 100644 index e7973ed3f..000000000 --- a/farmbot_core/priv/asset/migrations/20181022002450_create_persistent_regimens_table.exs +++ /dev/null @@ -1,37 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateRegimenInstancesTable do - use Ecto.Migration - - def change do - create table("persistent_regimens", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:started_at, :utc_datetime) - add(:epoch, :utc_datetime) - add(:next, :utc_datetime) - add(:next_sequence_id, :id) - - add( - :regimen_id, - references("regimens", type: :binary_id, column: :local_id) - ) - - add( - :farm_event_id, - references("farm_events", type: :binary_id, column: :local_id) - ) - - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - - create( - unique_index("persistent_regimens", [ - :local_id, - :regimen_id, - :farm_event_id - ]) - ) - - create(unique_index("persistent_regimens", :started_at)) - create(unique_index("persistent_regimens", :epoch)) - end -end diff --git a/farmbot_core/priv/asset/migrations/20181022002455_create_id_unique_indexes.exs b/farmbot_core/priv/asset/migrations/20181022002455_create_id_unique_indexes.exs deleted file mode 100644 index 125f8a327..000000000 --- a/farmbot_core/priv/asset/migrations/20181022002455_create_id_unique_indexes.exs +++ /dev/null @@ -1,21 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateIdUniqueIndexes do - use Ecto.Migration - - def change do - create(unique_index("devices", :id)) - create(unique_index("tools", :id)) - create(unique_index("peripherals", :id)) - create(unique_index("sensors", :id)) - create(unique_index("sensor_readings", :id)) - create(unique_index("sequences", :id)) - create(unique_index("regimens", :id)) - create(unique_index("pin_bindings", :id)) - create(unique_index("points", :id)) - create(unique_index("farm_events", :id)) - create(unique_index("firmware_configs", :id)) - create(unique_index("fbos_configs", :id)) - create(unique_index("farmware_installations", :id)) - create(unique_index("farmware_envs", :id)) - create(unique_index("diagnostic_dumps", :id)) - end -end diff --git a/farmbot_core/priv/asset/migrations/20190319162822_add_alerts_table.exs b/farmbot_core/priv/asset/migrations/20190319162822_add_alerts_table.exs deleted file mode 100644 index bce2cc043..000000000 --- a/farmbot_core/priv/asset/migrations/20190319162822_add_alerts_table.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddAlertsTable do - use Ecto.Migration - - def change do - create table("alerts", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:problem_tag, :string) - add(:priority, :integer) - add(:status, :string, default: "unresolved") - - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190326184305_add_body_to_regimen.exs b/farmbot_core/priv/asset/migrations/20190326184305_add_body_to_regimen.exs deleted file mode 100644 index 23f78a16c..000000000 --- a/farmbot_core/priv/asset/migrations/20190326184305_add_body_to_regimen.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddBodyToRegimen do - use Ecto.Migration - - def change do - # body - alter table("regimens") do - add(:body, {:array, :map}) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190326211733_rename_persistent_regimens_to_regimen_instances.exs b/farmbot_core/priv/asset/migrations/20190326211733_rename_persistent_regimens_to_regimen_instances.exs deleted file mode 100644 index ec4641a08..000000000 --- a/farmbot_core/priv/asset/migrations/20190326211733_rename_persistent_regimens_to_regimen_instances.exs +++ /dev/null @@ -1,7 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.RenamePersistentRegimensToRegimenInstances do - use Ecto.Migration - - def change do - rename(table(:persistent_regimens), to: table(:regimen_instances)) - end -end diff --git a/farmbot_core/priv/asset/migrations/20190327192248_add_body_to_farmevents.exs b/farmbot_core/priv/asset/migrations/20190327192248_add_body_to_farmevents.exs deleted file mode 100644 index d68766fc8..000000000 --- a/farmbot_core/priv/asset/migrations/20190327192248_add_body_to_farmevents.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddBodyToFarmevents do - use Ecto.Migration - - def change do - # body - alter table("farm_events") do - add(:body, {:array, :map}) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190424234139_add_update_channel_to_fbos_config.exs b/farmbot_core/priv/asset/migrations/20190424234139_add_update_channel_to_fbos_config.exs deleted file mode 100644 index e5075b046..000000000 --- a/farmbot_core/priv/asset/migrations/20190424234139_add_update_channel_to_fbos_config.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddUpdateChannelToFbosConfig do - use Ecto.Migration - - def change do - alter table("fbos_configs") do - add(:update_channel, :string) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190614165057_create_regimen_instance_and_farm_event_execution_tables.exs b/farmbot_core/priv/asset/migrations/20190614165057_create_regimen_instance_and_farm_event_execution_tables.exs deleted file mode 100644 index e0aff9531..000000000 --- a/farmbot_core/priv/asset/migrations/20190614165057_create_regimen_instance_and_farm_event_execution_tables.exs +++ /dev/null @@ -1,33 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateRegimenInstanceAndFarmEventExecutionTables do - use Ecto.Migration - - def change do - create table("regimen_instance_executions", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - - add( - :regimen_instance_local_id, - references("regimen_instances", type: :binary_id, column: :local_id) - ) - - add(:scheduled_at, :utc_datetime) - add(:executed_at, :utc_datetime) - add(:status, :string) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - - create table("farm_event_executions", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - - add( - :farm_event_local_id, - references("farm_events", type: :binary_id, column: :local_id) - ) - - add(:scheduled_at, :utc_datetime) - add(:executed_at, :utc_datetime) - add(:status, :string) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190705162506_add_api_migrated_to_fw_config.exs b/farmbot_core/priv/asset/migrations/20190705162506_add_api_migrated_to_fw_config.exs deleted file mode 100644 index 75f38172a..000000000 --- a/farmbot_core/priv/asset/migrations/20190705162506_add_api_migrated_to_fw_config.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddApiMigratedToFwConfig do - use Ecto.Migration - - def change do - alter table("firmware_configs") do - add(:api_migrated, :boolean) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190724183349_create_public_keys_table.exs b/farmbot_core/priv/asset/migrations/20190724183349_create_public_keys_table.exs deleted file mode 100644 index b254b4265..000000000 --- a/farmbot_core/priv/asset/migrations/20190724183349_create_public_keys_table.exs +++ /dev/null @@ -1,20 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreatePublicKeysTable do - use Ecto.Migration - - def change do - create table("public_keys", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:name, :string) - add(:public_key, :string) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - - create(unique_index("public_keys", :id)) - - alter table("syncs") do - add(:public_keys, {:array, :map}) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190814180644_create_first_party_farmware_table.exs b/farmbot_core/priv/asset/migrations/20190814180644_create_first_party_farmware_table.exs deleted file mode 100644 index 1ba0faadd..000000000 --- a/farmbot_core/priv/asset/migrations/20190814180644_create_first_party_farmware_table.exs +++ /dev/null @@ -1,20 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreateFirstPartyFarmwareTable do - use Ecto.Migration - - def change do - create table("first_party_farmwares", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:id, :id) - add(:url, :string) - add(:manifest, :map) - add(:monitor, :boolean, default: true) - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - - create(unique_index("first_party_farmwares", :id)) - - alter table("syncs") do - add(:first_party_farmwares, {:array, :map}) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190918171439_add_ota_update_fields_device.exs b/farmbot_core/priv/asset/migrations/20190918171439_add_ota_update_fields_device.exs deleted file mode 100644 index 2a80a7824..000000000 --- a/farmbot_core/priv/asset/migrations/20190918171439_add_ota_update_fields_device.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddOtaUpdateFieldsDevice do - use Ecto.Migration - - def change do - alter table(:devices) do - add(:last_ota, :utc_datetime) - add(:last_ota_checkup, :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190923214317_create_point_groups_table.exs b/farmbot_core/priv/asset/migrations/20190923214317_create_point_groups_table.exs deleted file mode 100644 index 018a731b2..000000000 --- a/farmbot_core/priv/asset/migrations/20190923214317_create_point_groups_table.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CreatePointGroupsTable do - use Ecto.Migration - - def change do - create table("point_groups", primary_key: false) do - add(:local_id, :binary_id, primary_key: true) - add(:monitor, :boolean, default: true) - - add(:id, :id) - add(:name, :string) - add(:point_ids, {:array, :integer}) - - timestamps(inserted_at: :created_at, type: :utc_datetime) - end - - create(unique_index("point_groups", :id)) - - alter table("syncs") do - add(:point_groups, {:array, :map}) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190924174628_add_firmware_params.exs b/farmbot_core/priv/asset/migrations/20190924174628_add_firmware_params.exs deleted file mode 100644 index 94831aa4a..000000000 --- a/farmbot_core/priv/asset/migrations/20190924174628_add_firmware_params.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddFirmwareParams do - use Ecto.Migration - - def change do - alter table("firmware_configs") do - add(:movement_motor_current_x, :float) - add(:movement_motor_current_y, :float) - add(:movement_motor_current_z, :float) - add(:movement_stall_sensitivity_x, :float) - add(:movement_stall_sensitivity_y, :float) - add(:movement_stall_sensitivity_z, :float) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190926161914_add_point_discarded_at.exs b/farmbot_core/priv/asset/migrations/20190926161914_add_point_discarded_at.exs deleted file mode 100644 index 1c4d3b581..000000000 --- a/farmbot_core/priv/asset/migrations/20190926161914_add_point_discarded_at.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddPointDiscardedAt do - use Ecto.Migration - - def change do - alter table(:points) do - add(:discarded_at, :utc_datetime) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20190926165507_force_resync_points.exs b/farmbot_core/priv/asset/migrations/20190926165507_force_resync_points.exs deleted file mode 100644 index dec7517c1..000000000 --- a/farmbot_core/priv/asset/migrations/20190926165507_force_resync_points.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.ForceResyncPoints do - use Ecto.Migration - - alias FarmbotCore.Asset.Repo - - def change do - Repo.query("TRUNCATE points") - end -end diff --git a/farmbot_core/priv/asset/migrations/20190930204239_add_point_group_sort_by.exs b/farmbot_core/priv/asset/migrations/20190930204239_add_point_group_sort_by.exs deleted file mode 100644 index 9b7b0674e..000000000 --- a/farmbot_core/priv/asset/migrations/20190930204239_add_point_group_sort_by.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddPointGroupSortBy do - use Ecto.Migration - - def change do - alter table("point_groups") do - add(:sort_type, :string) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20191108163819_add_ota_log_to_device.exs b/farmbot_core/priv/asset/migrations/20191108163819_add_ota_log_to_device.exs deleted file mode 100644 index 2af9f7875..000000000 --- a/farmbot_core/priv/asset/migrations/20191108163819_add_ota_log_to_device.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddOtaLogToDevice do - use Ecto.Migration - - def change do - alter table(:devices) do - add(:ota_hour, :integer) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20191108163850_force_resync_device.exs b/farmbot_core/priv/asset/migrations/20191108163850_force_resync_device.exs deleted file mode 100644 index 7f4b07cf6..000000000 --- a/farmbot_core/priv/asset/migrations/20191108163850_force_resync_device.exs +++ /dev/null @@ -1,7 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.ForceResyncDevice do - use Ecto.Migration - - def change do - execute("UPDATE devices SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20191122185123_add_mounted_tool_id_to_device_table.exs b/farmbot_core/priv/asset/migrations/20191122185123_add_mounted_tool_id_to_device_table.exs deleted file mode 100644 index f587c5c44..000000000 --- a/farmbot_core/priv/asset/migrations/20191122185123_add_mounted_tool_id_to_device_table.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddMountedToolIdToDeviceTable do - use Ecto.Migration - - def change do - alter table(:devices) do - add(:mounted_tool_id, :integer) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20191122185220_force_resync_device_for_mounted_tool_id.exs b/farmbot_core/priv/asset/migrations/20191122185220_force_resync_device_for_mounted_tool_id.exs deleted file mode 100644 index 47722bfe9..000000000 --- a/farmbot_core/priv/asset/migrations/20191122185220_force_resync_device_for_mounted_tool_id.exs +++ /dev/null @@ -1,7 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.ForceResyncDeviceForMountedToolId do - use Ecto.Migration - - def change do - execute("UPDATE devices SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs b/farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs deleted file mode 100644 index 97e4df90a..000000000 --- a/farmbot_core/priv/asset/migrations/20191212210054_resync_firmware_config.exs +++ /dev/null @@ -1,16 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.ResyncFirmwareConfig do - use Ecto.Migration - - def change do - alter table("firmware_configs") do - add(:movement_microsteps_x, :float) - add(:movement_microsteps_y, :float) - add(:movement_microsteps_z, :float) - end - - # will resync the firmware params - execute( - "UPDATE firmware_configs SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs b/farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs deleted file mode 100644 index febd16717..000000000 --- a/farmbot_core/priv/asset/migrations/20191219192107_add_needs_reset_to_device.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddNeedsResetToDevice do - use Ecto.Migration - - def change do - alter table("devices") do - add(:needs_reset, :boolean, default: false) - end - - # Invalidate cache of local device resource: - execute("UPDATE devices SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20200219001135_add_gantry_mounted_fields.exs b/farmbot_core/priv/asset/migrations/20200219001135_add_gantry_mounted_fields.exs deleted file mode 100644 index 434f13738..000000000 --- a/farmbot_core/priv/asset/migrations/20200219001135_add_gantry_mounted_fields.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddGantryMountedFields do - use Ecto.Migration - - def change do - alter table(:points) do - add(:gantry_mounted, :boolean, default: false) - end - - # Invalidate cache of local device resource: - execute("UPDATE points SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20200220214323_invalidate_local_points_gantry_mounted.exs b/farmbot_core/priv/asset/migrations/20200220214323_invalidate_local_points_gantry_mounted.exs deleted file mode 100644 index c80d7ec0f..000000000 --- a/farmbot_core/priv/asset/migrations/20200220214323_invalidate_local_points_gantry_mounted.exs +++ /dev/null @@ -1,7 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.InvalidateLocalPointsGantryMounted do - use Ecto.Migration - - def change do - execute("UPDATE points SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20200221204400_add_criteria_to_point_group.exs b/farmbot_core/priv/asset/migrations/20200221204400_add_criteria_to_point_group.exs deleted file mode 100644 index 6a66fd412..000000000 --- a/farmbot_core/priv/asset/migrations/20200221204400_add_criteria_to_point_group.exs +++ /dev/null @@ -1,13 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddCriteriaToPointGroup do - use Ecto.Migration - - def change do - alter table("point_groups") do - add(:criteria, :text) - end - - execute( - "UPDATE point_groups SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20200224204400_add_openfarm_slug_to_point.exs b/farmbot_core/priv/asset/migrations/20200224204400_add_openfarm_slug_to_point.exs deleted file mode 100644 index c40b23572..000000000 --- a/farmbot_core/priv/asset/migrations/20200224204400_add_openfarm_slug_to_point.exs +++ /dev/null @@ -1,11 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddOpenfarmSlugToPoint do - use Ecto.Migration - - def change do - alter table("points") do - add(:openfarm_slug, :string) - end - - execute("UPDATE points SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20200411204400_add_pullout_direction_to_point.exs b/farmbot_core/priv/asset/migrations/20200411204400_add_pullout_direction_to_point.exs deleted file mode 100644 index a357e5ad3..000000000 --- a/farmbot_core/priv/asset/migrations/20200411204400_add_pullout_direction_to_point.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddPulloutDirectionToPoint do - use Ecto.Migration - - def change do - alter table("points") do - # 0 means "NONE" - add(:pullout_direction, :integer, default: 0) - end - - execute("UPDATE points SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/asset/migrations/20200907153510_param_movement_spd_z2.exs b/farmbot_core/priv/asset/migrations/20200907153510_param_movement_spd_z2.exs deleted file mode 100644 index 28a0be678..000000000 --- a/farmbot_core/priv/asset/migrations/20200907153510_param_movement_spd_z2.exs +++ /dev/null @@ -1,11 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.ParamMovementSpdZ2 do - use Ecto.Migration - - def change do - alter table("firmware_configs") do - add(:movement_max_spd_z2, :float) - add(:movement_min_spd_z2, :float) - add(:movement_steps_acc_dec_z2, :float) - end - end -end diff --git a/farmbot_core/priv/asset/migrations/20200930210054_add_soil_height_safe_height.exs b/farmbot_core/priv/asset/migrations/20200930210054_add_soil_height_safe_height.exs deleted file mode 100644 index 186834fff..000000000 --- a/farmbot_core/priv/asset/migrations/20200930210054_add_soil_height_safe_height.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddSoilHeightSafeHeight do - use Ecto.Migration - - def change do - alter table("fbos_configs") do - add(:safe_height, :float) - add(:soil_height, :float) - end - - # will resync the firmware params - execute( - "UPDATE fbos_configs SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20210510182200_add_calibration_retry_fields.exs b/farmbot_core/priv/asset/migrations/20210510182200_add_calibration_retry_fields.exs deleted file mode 100644 index 70801ae13..000000000 --- a/farmbot_core/priv/asset/migrations/20210510182200_add_calibration_retry_fields.exs +++ /dev/null @@ -1,16 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddCalibrationRetryFields do - use Ecto.Migration - - def change do - alter table("firmware_configs") do - add(:movement_calibration_retry_x, :float) - add(:movement_calibration_retry_y, :float) - add(:movement_calibration_retry_z, :float) - end - - # will resync the firmware params - execute( - "UPDATE fbos_configs SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20210511182200_calibration_retry_field_fix.exs b/farmbot_core/priv/asset/migrations/20210511182200_calibration_retry_field_fix.exs deleted file mode 100644 index e368396ea..000000000 --- a/farmbot_core/priv/asset/migrations/20210511182200_calibration_retry_field_fix.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.CalibrationRetryFieldFix do - use Ecto.Migration - - # I made a typo in the previous migration. - def change do - execute( - "UPDATE firmware_configs SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20210514182200_add_stealth_chop_fields.exs b/farmbot_core/priv/asset/migrations/20210514182200_add_stealth_chop_fields.exs deleted file mode 100644 index 1bc4779ab..000000000 --- a/farmbot_core/priv/asset/migrations/20210514182200_add_stealth_chop_fields.exs +++ /dev/null @@ -1,19 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddStealthChopFields do - use Ecto.Migration - - def change do - alter table("firmware_configs") do - add(:movement_calibration_deadzone_x, :float) - add(:movement_calibration_deadzone_y, :float) - add(:movement_calibration_deadzone_z, :float) - add(:movement_axis_stealth_x, :float) - add(:movement_axis_stealth_y, :float) - add(:movement_axis_stealth_z, :float) - end - - # will resync the firmware params - execute( - "UPDATE firmware_configs SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20210514182201_stealth_chop_field_fix.exs b/farmbot_core/priv/asset/migrations/20210514182201_stealth_chop_field_fix.exs deleted file mode 100644 index 47d127feb..000000000 --- a/farmbot_core/priv/asset/migrations/20210514182201_stealth_chop_field_fix.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.StealthChopFieldFix do - use Ecto.Migration - - # I made a typo in the previous migration. - def change do - execute( - "UPDATE firmware_configs SET updated_at = \"1970-11-07 16:52:31.618000\"" - ) - end -end diff --git a/farmbot_core/priv/asset/migrations/20210914210730_add_device_location_attrs.exs b/farmbot_core/priv/asset/migrations/20210914210730_add_device_location_attrs.exs deleted file mode 100644 index c52d2dd3a..000000000 --- a/farmbot_core/priv/asset/migrations/20210914210730_add_device_location_attrs.exs +++ /dev/null @@ -1,14 +0,0 @@ -defmodule FarmbotCore.Asset.Repo.Migrations.AddDeviceLocationAttrs do - use Ecto.Migration - - def change do - alter table("devices") do - add(:lat, :float) - add(:lng, :float) - add(:indoor, :boolean) - end - - # will resync the firmware params - execute("UPDATE devices SET updated_at = \"1970-11-07 16:52:31.618000\"") - end -end diff --git a/farmbot_core/priv/config/migrations/20170922202022_add_eav_tables.exs b/farmbot_core/priv/config/migrations/20170922202022_add_eav_tables.exs deleted file mode 100644 index 8c7511512..000000000 --- a/farmbot_core/priv/config/migrations/20170922202022_add_eav_tables.exs +++ /dev/null @@ -1,40 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddEAVTables do - use Ecto.Migration - - def change do - create table("groups") do - add(:group_name, :string) - end - - create table("string_values") do - add(:value, :string) - end - - create table("bool_values") do - add(:value, :boolean) - end - - create table("float_values") do - add(:value, :float) - end - - create table("configs") do - add(:group_id, references(:groups), null: false) - add(:string_value_id, references(:string_values)) - add(:bool_value_id, references(:bool_values)) - add(:float_value_id, references(:float_values)) - add(:key, :string) - end - - create table("network_interfaces") do - add(:name, :string, null: false) - add(:type, :string, null: false) - - add(:ssid, :string) - add(:psk, :string) - add(:security, :string) - - add(:ipv4_method, :string) - end - end -end diff --git a/farmbot_core/priv/config/migrations/20170922221449_seed_groups.exs b/farmbot_core/priv/config/migrations/20170922221449_seed_groups.exs deleted file mode 100644 index 91eb618e6..000000000 --- a/farmbot_core/priv/config/migrations/20170922221449_seed_groups.exs +++ /dev/null @@ -1,326 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.SeedGroups do - use Ecto.Migration - alias FarmbotCore.Config.{Repo, Group, StringValue, BoolValue, FloatValue} - import FarmbotCore.Config.MigrationHelpers - import Ecto.Query, only: [from: 2] - - @group_names ["authorization", "hardware_params", "settings"] - @default_server Application.get_env(:farmbot_core, Farmbot.EctoMigrator)[ - :default_server - ] || - "https://my.farm.bot" - - def change do - populate_config_groups() - populate_config_values() - end - - defp populate_config_groups do - for name <- @group_names do - %Group{group_name: name} - |> Group.changeset() - |> Repo.insert() - end - end - - defp populate_config_values do - for name <- @group_names do - [group_id] = - from(g in Group, where: g.group_name == ^name, select: g.id) - |> Repo.all() - - populate_config_values(name, group_id) - end - end - - defp populate_config_values("authorization", group_id) do - create_value(StringValue, @default_server) - |> create_config(group_id, "server") - - create_value(StringValue, nil) |> create_config(group_id, "email") - create_value(StringValue, nil) |> create_config(group_id, "password") - create_value(StringValue, nil) |> create_config(group_id, "token") - end - - defp populate_config_values("settings", group_id) do - create_value(BoolValue, true) |> create_config(group_id, "os_auto_update") - - create_value(BoolValue, true) - |> create_config(group_id, "ignore_external_logs") - - create_value(BoolValue, true) |> create_config(group_id, "first_boot") - create_value(BoolValue, true) |> create_config(group_id, "first_sync") - create_value(StringValue, "A") |> create_config(group_id, "current_repo") - - create_value(BoolValue, true) - |> create_config(group_id, "first_party_farmware") - - create_value(BoolValue, false) |> create_config(group_id, "auto_sync") - - create_value(StringValue, nil) - |> create_config(group_id, "firmware_hardware") - - create_value(StringValue, nil) |> create_config(group_id, "timezone") - create_value(StringValue, "{}") |> create_config(group_id, "user_env") - - fpf_url = - Application.get_env(:farmbot_core, :farmware)[ - :first_part_farmware_manifest_url - ] - - create_value(StringValue, fpf_url) - |> create_config(group_id, "first_party_farmware_url") - end - - defp populate_config_values("hardware_params", group_id) do - create_value(FloatValue, nil) |> create_config(group_id, "param_version") - create_value(FloatValue, nil) |> create_config(group_id, "param_test") - create_value(FloatValue, nil) |> create_config(group_id, "param_config_ok") - create_value(FloatValue, nil) |> create_config(group_id, "param_use_eeprom") - - create_value(FloatValue, nil) - |> create_config(group_id, "param_e_stop_on_mov_err") - - create_value(FloatValue, nil) - |> create_config(group_id, "param_mov_nr_retry") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_timeout_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_timeout_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_timeout_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_keep_active_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_keep_active_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_keep_active_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_at_boot_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_at_boot_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_at_boot_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_invert_endpoints_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_invert_endpoints_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_invert_endpoints_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_enable_endpoints_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_enable_endpoints_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_enable_endpoints_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_invert_motor_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_invert_motor_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_invert_motor_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_secondary_motor_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_secondary_motor_invert_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_steps_acc_dec_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_steps_acc_dec_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_steps_acc_dec_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_stop_at_home_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_stop_at_home_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_stop_at_home_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_up_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_up_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_up_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_step_per_mm_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_step_per_mm_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_step_per_mm_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_min_spd_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_min_spd_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_min_spd_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_spd_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_spd_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_home_spd_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_max_spd_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_max_spd_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_max_spd_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_enabled_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_enabled_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_enabled_z") - - create_value(FloatValue, nil) |> create_config(group_id, "encoder_type_x") - create_value(FloatValue, nil) |> create_config(group_id, "encoder_type_y") - create_value(FloatValue, nil) |> create_config(group_id, "encoder_type_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_missed_steps_max_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_missed_steps_max_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_missed_steps_max_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_scaling_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_scaling_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_scaling_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_missed_steps_decay_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_missed_steps_decay_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_missed_steps_decay_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_use_for_pos_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_use_for_pos_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "encoder_use_for_pos_z") - - create_value(FloatValue, nil) |> create_config(group_id, "encoder_invert_x") - create_value(FloatValue, nil) |> create_config(group_id, "encoder_invert_y") - create_value(FloatValue, nil) |> create_config(group_id, "encoder_invert_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_axis_nr_steps_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_axis_nr_steps_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_axis_nr_steps_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_stop_at_max_x") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_stop_at_max_y") - - create_value(FloatValue, nil) - |> create_config(group_id, "movement_stop_at_max_z") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_1_pin_nr") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_1_time_out") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_1_active_state") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_2_pin_nr") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_2_time_out") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_2_active_state") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_3_pin_nr") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_3_time_out") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_3_active_state") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_4_pin_nr") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_4_time_out") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_4_active_state") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_5_pin_nr") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_5_time_out") - - create_value(FloatValue, nil) - |> create_config(group_id, "pin_guard_5_active_state") - end -end diff --git a/farmbot_core/priv/config/migrations/20171025231226_add_farmware_table.exs b/farmbot_core/priv/config/migrations/20171025231226_add_farmware_table.exs deleted file mode 100644 index 7c12a5d44..000000000 --- a/farmbot_core/priv/config/migrations/20171025231226_add_farmware_table.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddDevicesTable do - use Ecto.Migration - - def change do - create table("farmware_repositories") do - add(:manifests, :text) - add(:url, :string) - end - - create(unique_index("farmware_repositories", [:url])) - end -end diff --git a/farmbot_core/priv/config/migrations/20171114135840_add_sync_cmd_table.exs b/farmbot_core/priv/config/migrations/20171114135840_add_sync_cmd_table.exs deleted file mode 100644 index 05d6f6caa..000000000 --- a/farmbot_core/priv/config/migrations/20171114135840_add_sync_cmd_table.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddSyncCmdTable do - use Ecto.Migration - - def change do - create table("sync_cmds") do - add(:remote_id, :integer) - add(:kind, :string) - add(:body, :string) - timestamps() - end - end -end diff --git a/farmbot_core/priv/config/migrations/20171130004447_add_gpio_registry.exs b/farmbot_core/priv/config/migrations/20171130004447_add_gpio_registry.exs deleted file mode 100644 index 9384c0e50..000000000 --- a/farmbot_core/priv/config/migrations/20171130004447_add_gpio_registry.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddGpioRegistry do - use Ecto.Migration - - def change do - create table(:gpio_registry) do - add(:pin, :integer) - add(:sequence_id, :integer) - end - end -end diff --git a/farmbot_core/priv/config/migrations/20171130024651_add_factory_reset_settings.exs b/farmbot_core/priv/config/migrations/20171130024651_add_factory_reset_settings.exs deleted file mode 100644 index 31752ba36..000000000 --- a/farmbot_core/priv/config/migrations/20171130024651_add_factory_reset_settings.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddFactoryResetSettings do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("disable_factory_reset", :bool, false) - create_settings_config("network_not_found_timer", :float, nil) - end -end diff --git a/farmbot_core/priv/config/migrations/20171130044049_add_sequence_complete_log_option.exs b/farmbot_core/priv/config/migrations/20171130044049_add_sequence_complete_log_option.exs deleted file mode 100644 index 6d6f66515..000000000 --- a/farmbot_core/priv/config/migrations/20171130044049_add_sequence_complete_log_option.exs +++ /dev/null @@ -1,11 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddSequenceCompleteLogOption do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("sequence_init_log", :bool, true) - create_settings_config("sequence_body_log", :bool, true) - create_settings_config("sequence_complete_log", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20171208041623_arduino_debug_param.exs b/farmbot_core/priv/config/migrations/20171208041623_arduino_debug_param.exs deleted file mode 100644 index e277def30..000000000 --- a/farmbot_core/priv/config/migrations/20171208041623_arduino_debug_param.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.ArduinoDebugParam do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("arduino_debug_messages", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20171208205940_add_firmware_io_log.exs b/farmbot_core/priv/config/migrations/20171208205940_add_firmware_io_log.exs deleted file mode 100644 index 6552a730d..000000000 --- a/farmbot_core/priv/config/migrations/20171208205940_add_firmware_io_log.exs +++ /dev/null @@ -1,24 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddFirmwareIoLog do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - @default_firmware_io_logs Application.get_env( - :farmbot_core, - Farmbot.EctoMigrator - )[:default_firmware_io_logs] || false - - def change do - create_settings_config( - "firmware_input_log", - :bool, - @default_firmware_io_logs - ) - - create_settings_config( - "firmware_output_log", - :bool, - @default_firmware_io_logs - ) - end -end diff --git a/farmbot_core/priv/config/migrations/20171227200214_add_amqp_bootup_log.exs b/farmbot_core/priv/config/migrations/20171227200214_add_amqp_bootup_log.exs deleted file mode 100644 index c9dbb6d1a..000000000 --- a/farmbot_core/priv/config/migrations/20171227200214_add_amqp_bootup_log.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddAmqpBootupLog do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("log_amqp_connected", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20180103212728_add_beta_chanel_config.exs b/farmbot_core/priv/config/migrations/20180103212728_add_beta_chanel_config.exs deleted file mode 100644 index bedab7f31..000000000 --- a/farmbot_core/priv/config/migrations/20180103212728_add_beta_chanel_config.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddBetaChanelConfig do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("beta_opt_in", :bool, false) - create_settings_config("os_update_server_overwrite", :string, nil) - end -end diff --git a/farmbot_core/priv/config/migrations/20180104020301_add_special_fw_migration_config.exs b/farmbot_core/priv/config/migrations/20180104020301_add_special_fw_migration_config.exs deleted file mode 100644 index c5688f26d..000000000 --- a/farmbot_core/priv/config/migrations/20180104020301_add_special_fw_migration_config.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddSpecialFwMigrationConfig do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("fw_upgrade_migration", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20180122161013_add_api_migrated_flag.exs b/farmbot_core/priv/config/migrations/20180122161013_add_api_migrated_flag.exs deleted file mode 100644 index 5650cfea4..000000000 --- a/farmbot_core/priv/config/migrations/20180122161013_add_api_migrated_flag.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddApiMigratedFlag do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("api_migrated", :bool, false) - end -end diff --git a/farmbot_core/priv/config/migrations/20180123173929_email_on_estop.exs b/farmbot_core/priv/config/migrations/20180123173929_email_on_estop.exs deleted file mode 100644 index 7f9ce635a..000000000 --- a/farmbot_core/priv/config/migrations/20180123173929_email_on_estop.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.EmailOnEstop do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("email_on_estop", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20180202171932_add_network_interface_deprication.exs b/farmbot_core/priv/config/migrations/20180202171932_add_network_interface_deprication.exs deleted file mode 100644 index 164beb1e9..000000000 --- a/farmbot_core/priv/config/migrations/20180202171932_add_network_interface_deprication.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddNetworkInterfaceDeprication do - use Ecto.Migration - - def change do - alter table("network_interfaces") do - add(:migrated, :boolean) - end - end -end diff --git a/farmbot_core/priv/config/migrations/20180213164114_ignore_fbos_config.exs b/farmbot_core/priv/config/migrations/20180213164114_ignore_fbos_config.exs deleted file mode 100644 index 6e8eaa86b..000000000 --- a/farmbot_core/priv/config/migrations/20180213164114_ignore_fbos_config.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.IgnoreFbosConfig do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("ignore_fbos_config", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20180226174206_network_unique_constraint.exs b/farmbot_core/priv/config/migrations/20180226174206_network_unique_constraint.exs deleted file mode 100644 index ba9d350ed..000000000 --- a/farmbot_core/priv/config/migrations/20180226174206_network_unique_constraint.exs +++ /dev/null @@ -1,7 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.NetworkUniqueConstraint do - use Ecto.Migration - - def change do - create(unique_index(:network_interfaces, [:name])) - end -end diff --git a/farmbot_core/priv/config/migrations/20180307180141_firmware_initialized_flag.exs b/farmbot_core/priv/config/migrations/20180307180141_firmware_initialized_flag.exs deleted file mode 100644 index acfdf61f6..000000000 --- a/farmbot_core/priv/config/migrations/20180307180141_firmware_initialized_flag.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.FirmwareInitializedFlag do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("firmware_needs_first_sync", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20180308162327_add_maybe_hidden_network_flag.exs b/farmbot_core/priv/config/migrations/20180308162327_add_maybe_hidden_network_flag.exs deleted file mode 100644 index 212afb2fc..000000000 --- a/farmbot_core/priv/config/migrations/20180308162327_add_maybe_hidden_network_flag.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddMaybeHiddenNetworkFlag do - use Ecto.Migration - - def change do - alter table("network_interfaces") do - add(:maybe_hidden, :boolean) - end - end -end diff --git a/farmbot_core/priv/config/migrations/20180403180047_add_regimen_persistence_table.exs b/farmbot_core/priv/config/migrations/20180403180047_add_regimen_persistence_table.exs deleted file mode 100644 index 06d6017e2..000000000 --- a/farmbot_core/priv/config/migrations/20180403180047_add_regimen_persistence_table.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddRegimenPersistenceTable do - use Ecto.Migration - - def change do - create table("persistent_regimens") do - add(:regimen_id, :integer) - add(:time, :utc_datetime) - end - - unique_index("persistent_regimens", :regimen_id) - end -end diff --git a/farmbot_core/priv/config/migrations/20180403180213_add_sync_timeout.exs b/farmbot_core/priv/config/migrations/20180403180213_add_sync_timeout.exs deleted file mode 100644 index 3415ef9f8..000000000 --- a/farmbot_core/priv/config/migrations/20180403180213_add_sync_timeout.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddSyncTimeout do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("sync_timeout_ms", :float, 90_000.00) - end -end diff --git a/farmbot_core/priv/config/migrations/20180409142944_param_invert_endstops_2.exs b/farmbot_core/priv/config/migrations/20180409142944_param_invert_endstops_2.exs deleted file mode 100644 index df48bc08a..000000000 --- a/farmbot_core/priv/config/migrations/20180409142944_param_invert_endstops_2.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.ParamInvertEndstops2 do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_hw_param("movement_invert_2_endpoints_x") - create_hw_param("movement_invert_2_endpoints_y") - create_hw_param("movement_invert_2_endpoints_z") - end -end diff --git a/farmbot_core/priv/config/migrations/20180411201055_add regimen indexes.exs b/farmbot_core/priv/config/migrations/20180411201055_add regimen indexes.exs deleted file mode 100644 index 38798b80b..000000000 --- a/farmbot_core/priv/config/migrations/20180411201055_add regimen indexes.exs +++ /dev/null @@ -1,15 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddRegimenIndexs do - use Ecto.Migration - - def change do - alter table("persistent_regimens") do - add(:farm_event_id, :integer) - end - - create( - unique_index("persistent_regimens", [:regimen_id, :time, :farm_event_id], - name: :regimen_start_time - ) - ) - end -end diff --git a/farmbot_core/priv/config/migrations/20180416165217_add_beta_state.exs b/farmbot_core/priv/config/migrations/20180416165217_add_beta_state.exs deleted file mode 100644 index 924655b2d..000000000 --- a/farmbot_core/priv/config/migrations/20180416165217_add_beta_state.exs +++ /dev/null @@ -1,21 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddBetaState do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - @default_currently_on_beta Application.get_env( - :farmbot_core, - FarmbotCore.EctoMigrator - )[:default_currently_on_beta] - - if is_nil(@default_currently_on_beta), - do: - Mix.raise("Missing application env config: `:default_currently_on_beta`") - - def change do - create_settings_config( - "currently_on_beta", - :bool, - @default_currently_on_beta - ) - end -end diff --git a/farmbot_core/priv/config/migrations/20180427142609_add_advanced_network_settings.exs b/farmbot_core/priv/config/migrations/20180427142609_add_advanced_network_settings.exs deleted file mode 100644 index 135eee3c5..000000000 --- a/farmbot_core/priv/config/migrations/20180427142609_add_advanced_network_settings.exs +++ /dev/null @@ -1,13 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddAdvancedNetworkSettings do - use Ecto.Migration - - def change do - alter table(:network_interfaces) do - add(:ipv4_address, :string) - add(:ipv4_gateway, :string) - add(:ipv4_subnet_mask, :string) - add(:domain, :string) - add(:name_servers, :string) - end - end -end diff --git a/farmbot_core/priv/config/migrations/20180627122653_add_secret_field.exs b/farmbot_core/priv/config/migrations/20180627122653_add_secret_field.exs deleted file mode 100644 index 968404566..000000000 --- a/farmbot_core/priv/config/migrations/20180627122653_add_secret_field.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddSecretField do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_auth_config("secret", :string, nil) - end -end diff --git a/farmbot_core/priv/config/migrations/20180702143518_add_ntp_and_dns_configs.exs b/farmbot_core/priv/config/migrations/20180702143518_add_ntp_and_dns_configs.exs deleted file mode 100644 index 4f9c90aa8..000000000 --- a/farmbot_core/priv/config/migrations/20180702143518_add_ntp_and_dns_configs.exs +++ /dev/null @@ -1,43 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddNtpAndDnsConfigs do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - @default_ntp_server_1 Application.get_env( - :farmbot_core, - FarmbotCore.EctoMigrator - )[:default_ntp_server_1] - @default_ntp_server_2 Application.get_env( - :farmbot_core, - FarmbotCore.EctoMigrator - )[:default_ntp_server_2] - @default_dns_name Application.get_env(:farmbot_core, FarmbotCore.EctoMigrator)[ - :default_dns_name - ] - - unless @default_ntp_server_1 && @default_ntp_server_2 && @default_dns_name do - @config_error """ - config :farmbot_core, FarmbotCore.EctoMigrator, [ - default_ntp_server_1: "0.pool.ntp.org", - default_ntp_server_2: "1.pool.ntp.org", - default_dns_name: "my.farm.bot" - ] - """ - Mix.raise(@config_error) - end - - def change do - create_settings_config( - "default_ntp_server_1", - :string, - @default_ntp_server_1 - ) - - create_settings_config( - "default_ntp_server_2", - :string, - @default_ntp_server_2 - ) - - create_settings_config("default_dns_name", :string, @default_dns_name) - end -end diff --git a/farmbot_core/priv/config/migrations/20180724200909_migrate_secret.exs b/farmbot_core/priv/config/migrations/20180724200909_migrate_secret.exs deleted file mode 100644 index b3abdbdbd..000000000 --- a/farmbot_core/priv/config/migrations/20180724200909_migrate_secret.exs +++ /dev/null @@ -1,49 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.MigrateSecret do - use Ecto.Migration - import Ecto.Query - - def change do - group = - FarmbotCore.Config.Repo.one!( - from(g in FarmbotCore.Config.Group, - where: g.group_name == "authorization" - ) - ) - - pass_ref = - FarmbotCore.Config.Repo.one!( - from(c in FarmbotCore.Config.Config, - where: c.key == "password" and c.group_id == ^group.id - ) - ) - - sec_ref = - FarmbotCore.Config.Repo.one!( - from(c in FarmbotCore.Config.Config, - where: c.key == "secret" and c.group_id == ^group.id - ) - ) - - pass = - FarmbotCore.Config.Repo.one!( - from(s in FarmbotCore.Config.StringValue, - where: s.id == ^pass_ref.string_value_id - ) - ) - - sec = - FarmbotCore.Config.Repo.one!( - from(s in FarmbotCore.Config.StringValue, - where: s.id == ^sec_ref.string_value_id - ) - ) - - if pass.value do - Ecto.Changeset.change(sec, %{value: pass.value}) - |> FarmbotCore.Config.Repo.update!() - - Ecto.Changeset.change(pass, %{value: nil}) - |> FarmbotCore.Config.Repo.update!() - end - end -end diff --git a/farmbot_core/priv/config/migrations/20180802155935_neets_http_sync.exs b/farmbot_core/priv/config/migrations/20180802155935_neets_http_sync.exs deleted file mode 100644 index 3fc90f29d..000000000 --- a/farmbot_core/priv/config/migrations/20180802155935_neets_http_sync.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.NeetsHttpSync do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("needs_http_sync", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20180813200950_add_ssh_opts.exs b/farmbot_core/priv/config/migrations/20180813200950_add_ssh_opts.exs deleted file mode 100644 index 79fef0951..000000000 --- a/farmbot_core/priv/config/migrations/20180813200950_add_ssh_opts.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule Farmbot.System.ConfigStorage.Migrations.AddSshOpts do - use Ecto.Migration - - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("ssh_port", :float, 22.0) - create_settings_config("authorized_ssh_key", :string, nil) - end -end diff --git a/farmbot_core/priv/config/migrations/20180814180226_add_farmware_migration.exs b/farmbot_core/priv/config/migrations/20180814180226_add_farmware_migration.exs deleted file mode 100644 index 7bf5d3b59..000000000 --- a/farmbot_core/priv/config/migrations/20180814180226_add_farmware_migration.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddFarmwareMigration do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - @default FarmbotCore.Project.version() == "6.5.0" - - def change do - create_settings_config("firmware_needs_migration", :bool, @default) - end -end diff --git a/farmbot_core/priv/config/migrations/20180814202716_add_ignore_fw_config.exs b/farmbot_core/priv/config/migrations/20180814202716_add_ignore_fw_config.exs deleted file mode 100644 index 6a432cf97..000000000 --- a/farmbot_core/priv/config/migrations/20180814202716_add_ignore_fw_config.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule Farmbot.System.ConfigStorage.Migrations.AddIgnoreFwConfig do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("ignore_fw_config", :bool, false) - end -end diff --git a/farmbot_core/priv/config/migrations/20181203195326_migrate_settings.exs b/farmbot_core/priv/config/migrations/20181203195326_migrate_settings.exs deleted file mode 100644 index ce0611370..000000000 --- a/farmbot_core/priv/config/migrations/20181203195326_migrate_settings.exs +++ /dev/null @@ -1,40 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.MigrateSettings do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - delete_settings_config("auto_sync", :bool) - delete_settings_config("firmware_needs_migration", :bool) - delete_settings_config("email_on_estop", :bool) - delete_settings_config("disable_factory_reset", :bool) - delete_settings_config("ignore_fbos_config", :bool) - delete_settings_config("os_update_server_overwrite", :string) - delete_settings_config("network_not_found_timer", :float) - delete_settings_config("timezone", :string) - delete_settings_config("first_party_farmware_url", :string) - delete_settings_config("sync_timeout_ms", :float) - delete_settings_config("ignore_external_logs", :bool) - delete_settings_config("needs_http_sync", :bool) - delete_settings_config("currently_on_beta", :bool) - delete_settings_config("arduino_debug_messages", :bool) - delete_settings_config("firmware_output_log", :bool) - delete_settings_config("firmware_input_log", :bool) - delete_settings_config("beta_opt_in", :bool) - delete_settings_config("log_amqp_connected", :bool) - delete_settings_config("current_repo", :string) - delete_settings_config("user_env", :string) - delete_settings_config("sequence_complete_log", :bool) - delete_settings_config("sequence_init_log", :bool) - delete_settings_config("sequence_body_log", :bool) - delete_settings_config("ignore_fw_config", :bool) - delete_settings_config("api_migrated", :bool) - delete_settings_config("firmware_needs_first_sync", :bool) - delete_settings_config("first_boot", :bool) - delete_settings_config("authorized_ssh_key", :string) - delete_settings_config("firmware_hardware", :string) - delete_settings_config("first_party_farmware", :bool) - delete_settings_config("first_sync", :bool) - delete_settings_config("ssh_port", :float) - delete_settings_config("os_auto_update", :bool) - end -end diff --git a/farmbot_core/priv/config/migrations/20181204173345_add_firmware_flash_setting.exs b/farmbot_core/priv/config/migrations/20181204173345_add_firmware_flash_setting.exs deleted file mode 100644 index 558cba5d6..000000000 --- a/farmbot_core/priv/config/migrations/20181204173345_add_firmware_flash_setting.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddFirmwareFlashSetting do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("firmware_needs_flash", :bool, true) - end -end diff --git a/farmbot_core/priv/config/migrations/20181211191350_add_network_regulatory_domain.exs b/farmbot_core/priv/config/migrations/20181211191350_add_network_regulatory_domain.exs deleted file mode 100644 index 4da1fe96e..000000000 --- a/farmbot_core/priv/config/migrations/20181211191350_add_network_regulatory_domain.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotCore.Config.Migrations.AddNetworkRegulatoryDomain do - use Ecto.Migration - - def change do - alter table("network_interfaces") do - add(:regulatory_domain, :string, default: "US") - end - end -end diff --git a/farmbot_core/priv/config/migrations/20190110180643_add_eap_settings.exs b/farmbot_core/priv/config/migrations/20190110180643_add_eap_settings.exs deleted file mode 100644 index 082dbcadd..000000000 --- a/farmbot_core/priv/config/migrations/20190110180643_add_eap_settings.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Config.Migrations.AddEapSettings do - use Ecto.Migration - - def change do - alter table("network_interfaces") do - add(:identity, :string) - add(:password, :string) - end - end -end diff --git a/farmbot_core/priv/config/migrations/20190208211728_add_update_channel_field.exs b/farmbot_core/priv/config/migrations/20190208211728_add_update_channel_field.exs deleted file mode 100644 index e6b2fadf7..000000000 --- a/farmbot_core/priv/config/migrations/20190208211728_add_update_channel_field.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule FarmbotCore.Config.Migrations.AddUpdateChannelField do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("update_channel", :string, nil) - end -end diff --git a/farmbot_core/priv/config/migrations/20190705203806_add_firmware_needs_open_flag.exs b/farmbot_core/priv/config/migrations/20190705203806_add_firmware_needs_open_flag.exs deleted file mode 100644 index ed5fcc9d7..000000000 --- a/farmbot_core/priv/config/migrations/20190705203806_add_firmware_needs_open_flag.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.AddFirmwareNeedsOpenFlag do - use Ecto.Migration - import FarmbotCore.Config.MigrationHelpers - - def change do - create_settings_config("firmware_needs_open", :bool, false) - end -end diff --git a/farmbot_core/priv/config/migrations/20191022175032_set_firmware_flash_true.exs b/farmbot_core/priv/config/migrations/20191022175032_set_firmware_flash_true.exs deleted file mode 100644 index fc574148f..000000000 --- a/farmbot_core/priv/config/migrations/20191022175032_set_firmware_flash_true.exs +++ /dev/null @@ -1,21 +0,0 @@ -defmodule FarmbotCore.Config.Repo.Migrations.SetFirmwareFlashTrue do - use Ecto.Migration - - def up do - FarmbotCore.Config.update_config_value( - :bool, - "settings", - "firmware_needs_flash", - true - ) - end - - def down do - FarmbotCore.Config.update_config_value( - :bool, - "settings", - "firmware_needs_flash", - true - ) - end -end diff --git a/farmbot_core/priv/easter_eggs.json b/farmbot_core/priv/easter_eggs.json deleted file mode 100644 index 0971bc92c..000000000 --- a/farmbot_core/priv/easter_eggs.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "nouns": [ - { - "fav_song_link": "https://www.youtube.com/watch?v=d4nbfPZa9Ws" - }, - { - "fav_activity": "gardening" - }, - { - "fav_movie": "Star Wars" - } - ], - "verbs": [ - "is listening to :musical_score: <%= fav_song_link %>", - "is doing my favorite activity <%= fav_activity %>", - "is watching <%= fav_movie %> :film_projector:", - "wants to know when it should water it's plants? :sweat_drops: :sweat_drops:", - "is getting kind of bored... :clock830: :zzz:", - "is happy", - "is ecstatic", - "is lonely", - "is on strike", - "says hi", - "says hello", - "is growing vegetables for you", - "is watching for squirrels", - "sees plants in the clouds :cloud: :seedling:", - "is singing", - "wants a bath", - ":robot_face:", - ">:(", - "(>'-')>", - ":)", - "9____9", - "¯\\_(ツ)_/¯" - ] -} diff --git a/farmbot_core/priv/logger/migrations/20180620135642_add_log_buffer.exs b/farmbot_core/priv/logger/migrations/20180620135642_add_log_buffer.exs deleted file mode 100644 index 8b8c7fc81..000000000 --- a/farmbot_core/priv/logger/migrations/20180620135642_add_log_buffer.exs +++ /dev/null @@ -1,22 +0,0 @@ -defmodule FarmbotCore.Logger.Repo.Migrations.AddLogBuffer do - use Ecto.Migration - - def change do - create table("logs", primary_key: false) do - add(:id, :binary_id, primary_key: true) - add(:message, :text) - add(:level, :string) - add(:verbosity, :integer) - add(:meta, :string) - add(:function, :string) - add(:file, :string) - add(:line, :integer) - add(:module, :string) - add(:version, :string) - add(:commit, :string) - add(:target, :string) - add(:env, :string) - timestamps() - end - end -end diff --git a/farmbot_core/priv/logger/migrations/20190711221214_add_message_hash_to_logs_table.exs b/farmbot_core/priv/logger/migrations/20190711221214_add_message_hash_to_logs_table.exs deleted file mode 100644 index 7380cc861..000000000 --- a/farmbot_core/priv/logger/migrations/20190711221214_add_message_hash_to_logs_table.exs +++ /dev/null @@ -1,10 +0,0 @@ -defmodule FarmbotCore.Logger.Repo.Migrations.AddMessageHashToLogsTable do - use Ecto.Migration - - def change do - alter table("logs") do - add(:hash, :binary) - add(:duplicates, :integer) - end - end -end diff --git a/farmbot_core/test/firmware/avr_dude_test.exs b/farmbot_core/test/firmware/avr_dude_test.exs deleted file mode 100644 index 631c3dac9..000000000 --- a/farmbot_core/test/firmware/avr_dude_test.exs +++ /dev/null @@ -1,70 +0,0 @@ -defmodule FarmbotOs.AvrdudeTest do - use ExUnit.Case - alias FarmbotCore.Firmware.Avrdude - use Mimic - - setup :verify_on_exit! - - test "failure handling" do - reset_fn = fn -> - raise RuntimeError, "foo" - end - - expect(FarmbotCore.LogExecutor, :execute, 1, fn log -> - msg = log.message - assert String.contains?(msg, "%RuntimeError{message: \"foo\"}") - end) - - Avrdude.call_reset_fun(reset_fn) - end - - test "works" do - File.touch("/tmp/wow") - - expect(MuonTrap, :cmd, 1, fn cmd, args, opts -> - assert cmd == "avrdude" - - assert args == [ - "-patmega2560", - "-cwiring", - "-P/dev/null", - "-b115200", - "-D", - "-V", - "-v", - "-Uflash:w:/tmp/wow:i" - ] - - assert opts == [stderr_to_stdout: true] - {"hello", 0} - end) - - Avrdude.flash("/tmp/wow", "null", fn -> "YOLO" end) - end - - test "handles /dev file names, also" do - File.touch("/tmp/wow") - - expect(MuonTrap, :cmd, 1, fn cmd, args, opts -> - assert cmd == "avrdude" - - assert args == [ - "-patmega2560", - "-cwiring", - "-P/dev/null", - "-b115200", - "-D", - "-V", - "-v", - "-Uflash:w:/tmp/wow:i" - ] - - assert opts == [stderr_to_stdout: true] - {"foo", 0} - end) - - Avrdude.flash("/tmp/wow", "/dev/null", fn -> - "YOLO" - end) - end -end diff --git a/farmbot_core/test/test_helper.exs b/farmbot_core/test/test_helper.exs deleted file mode 100644 index c3bd6ccef..000000000 --- a/farmbot_core/test/test_helper.exs +++ /dev/null @@ -1,37 +0,0 @@ -Application.ensure_all_started(:mimic) -tz = System.get_env("TZ") || Timex.local().time_zone - -FarmbotCore.Asset.Device.changeset(FarmbotCore.Asset.device(), %{timezone: tz}) -|> FarmbotCore.Asset.Repo.insert_or_update!() - -[ - Circuits.UART, - FarmbotCore.Celery, - FarmbotCore.Celery.Compiler.Lua, - FarmbotCore.Celery.Scheduler, - FarmbotCore.Celery.SpecialValue, - FarmbotCore.Celery.SysCalls, - FarmbotCore.Celery.SysCalls.Stubs, - FarmbotCore.Asset, - FarmbotCore.Asset.Private, - FarmbotCore.Asset.Repo, - FarmbotCore.BotState, - FarmbotCore.Firmware.Avrdude, - FarmbotCore.Firmware.ConfigUploader, - FarmbotCore.Firmware.Flash, - FarmbotCore.Firmware.FlashUtils, - FarmbotCore.Firmware.Resetter, - FarmbotCore.Firmware.TxBuffer, - FarmbotCore.Firmware.UARTCore, - FarmbotCore.Firmware.UARTCoreSupport, - FarmbotCore.Firmware.UARTDetector, - FarmbotCore.FirmwareEstopTimer, - FarmbotCore.LogExecutor, - MuonTrap, - NervesTime, - Timex -] -|> Enum.map(&Mimic.copy/1) - -ExUnit.configure(max_cases: 1) -ExUnit.start() diff --git a/farmbot_ext/.formatter.exs b/farmbot_ext/.formatter.exs deleted file mode 100644 index 3f6d5c682..000000000 --- a/farmbot_ext/.formatter.exs +++ /dev/null @@ -1,5 +0,0 @@ -[ - import_deps: [:ecto], - inputs: ["*.{ex,exs}", "{config,priv,lib,test}/**/*.{ex,exs}"], - subdirectories: ["priv/*/migrations"] -] diff --git a/farmbot_ext/.gitignore b/farmbot_ext/.gitignore deleted file mode 100644 index 93ae1d43b..000000000 --- a/farmbot_ext/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -# The directory Mix will write compiled artifacts to. -/_build/ - -# If you run "mix test --cover", coverage assets end up here. -/cover/ - -# The directory Mix downloads your dependencies sources to. -/deps/ - -# Where 3rd-party dependencies like ExDoc output generated docs. -/doc/ - -# Ignore .fetch files in case you like to edit your project deps locally. -/.fetch - -# If the VM crashes, it generates a dump, let's ignore it too. -erl_crash.dump - -# Also ignore archive artifacts (built via "mix archive.build"). -*.ez - -# Ignore package tarball (built via "mix hex.build"). -farmbot_ext-*.tar - -*.sqlite3 -*.coverdata diff --git a/farmbot_ext/.tool-versions b/farmbot_ext/.tool-versions deleted file mode 120000 index d54b92fcb..000000000 --- a/farmbot_ext/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -../.tool-versions \ No newline at end of file diff --git a/farmbot_ext/config/config.exs b/farmbot_ext/config/config.exs deleted file mode 100644 index e6233fc89..000000000 --- a/farmbot_ext/config/config.exs +++ /dev/null @@ -1,75 +0,0 @@ -use Mix.Config -config :tesla, adapter: Tesla.Adapter.Hackney - -config :logger, handle_otp_reports: true, handle_sasl_reports: true - -# TODO(Rick) We probably don't need to use this anymore now that Mox is a thing. -config :farmbot_core, FarmbotCore.Celery.SysCalls, sys_calls: FarmbotCore.Celery.SysCalls.Stubs - -repos = [FarmbotCore.Config.Repo, FarmbotCore.Logger.Repo, FarmbotCore.Asset.Repo] -config :farmbot_core, ecto_repos: repos -config :farmbot_ext, ecto_repos: repos - -config :ecto, json_library: FarmbotCore.JSON - -config :farmbot_core, FarmbotCore.Config.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: "config.#{Mix.env()}.db", - priv: "../farmbot_core/priv/config" - -config :farmbot_core, FarmbotCore.Logger.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: "logger.#{Mix.env()}.db", - priv: "../farmbot_core/priv/logger" - -config :farmbot_core, FarmbotCore.Asset.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: "asset.#{Mix.env()}.db", - priv: "../farmbot_core/priv/asset" - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding, - gpio_handler: FarmbotCore.PinBindingWorker.StubGPIOHandler - -config :farmbot_core, Elixir.FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey, - ssh_handler: FarmbotCore.PublicKeyHandler.StubSSHHandler - -config :farmbot_core, FarmbotCore.BotState.FileSystem, root_dir: "/tmp/farmbot_state" - -config :farmbot_core, FarmbotCore.Leds, gpio_handler: FarmbotCore.Leds.StubHandler - -config :farmbot_core, FarmbotCore.JSON, json_parser: FarmbotCore.JSON.JasonParser - -config :farmbot_core, FarmbotCore.Core.CeleryScript.RunTimeWrapper, - celery_script_io_layer: FarmbotCore.Core.CeleryScript.StubIOLayer - -config :farmbot_core, FarmbotCore.EctoMigrator, - default_firmware_io_logs: false, - default_server: "https://my.farm.bot", - default_dns_name: "my.farm.bot", - default_ntp_server_1: "0.pool.ntp.org", - default_ntp_server_2: "1.pool.ntp.org", - default_currently_on_beta: - String.contains?(to_string(:os.cmd('git rev-parse --abbrev-ref HEAD')), "beta") - -is_test? = Mix.env() == :test - -config :farmbot_ext, FarmbotExt.Time, disable_timeouts: is_test? - -if is_test? do - config :ex_unit, capture_logs: true - mapper = fn mod -> config :farmbot_ext, mod, children: [] end - - list = [ - FarmbotExt, - FarmbotExt.MQTT.Supervisor, - FarmbotExt.MQTT.ChannelSupervisor, - FarmbotExt.DirtyWorker.Supervisor, - FarmbotExt.EagerLoader.Supervisor, - FarmbotExt.Bootstrap.Supervisor - ] - - Enum.map(list, mapper) -end diff --git a/farmbot_ext/coveralls.json b/farmbot_ext/coveralls.json deleted file mode 100644 index c4461cedc..000000000 --- a/farmbot_ext/coveralls.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "coverage_options": { - "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 59.0 - } -} diff --git a/farmbot_ext/lib/farmbot_ext.ex b/farmbot_ext/lib/farmbot_ext.ex deleted file mode 100644 index 08317b1de..000000000 --- a/farmbot_ext/lib/farmbot_ext.ex +++ /dev/null @@ -1,16 +0,0 @@ -defmodule FarmbotExt do - @moduledoc false - - use Application - - def start(_type, _args) do - Supervisor.start_link(children(), opts()) - end - - def opts, do: [strategy: :one_for_one, name: __MODULE__] - - def children do - config = Application.get_env(:farmbot_ext, __MODULE__) || [] - Keyword.get(config, :children, [FarmbotExt.Bootstrap]) - end -end diff --git a/farmbot_ext/mix.exs b/farmbot_ext/mix.exs deleted file mode 100644 index 3c1211dbc..000000000 --- a/farmbot_ext/mix.exs +++ /dev/null @@ -1,54 +0,0 @@ -defmodule FarmbotExt.MixProject do - use Mix.Project - @version Path.join([__DIR__, "..", "VERSION"]) |> File.read!() |> String.trim() - @elixir_version Path.join([__DIR__, "..", "ELIXIR_VERSION"]) |> File.read!() |> String.trim() - - def project do - [ - app: :farmbot_ext, - version: @version, - elixir: @elixir_version, - elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], - start_permanent: Mix.env() == :prod, - elixirc_paths: ["lib", "vendor"], - deps: deps(), - test_coverage: [tool: ExCoveralls], - preferred_cli_env: [ - coveralls: :test, - "coveralls.detail": :test, - "coveralls.post": :test, - "coveralls.html": :test - ], - source_url: "https://github.com/Farmbot/farmbot_os", - homepage_url: "http://farmbot.io", - docs: [ - logo: "../farmbot_os/priv/static/farmbot_logo.png", - extras: Path.wildcard("../docs/**/*.md") - ] - ] - end - - # Run "mix help compile.app" to learn about applications. - def application do - [ - extra_applications: [:logger], - mod: {FarmbotExt, []} - ] - end - - # Run "mix help deps" to learn about dependencies. - defp deps do - [ - {:tortoise, "~> 0.10"}, - {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false}, - {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, - {:extty, "~> 0.2.1"}, - {:farmbot_core, path: "../farmbot_core", env: Mix.env()}, - {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:hackney, "~> 1.18"}, - {:mimic, "~> 1.5.1", only: :test}, - {:tesla, "~> 1.4.3"}, - {:uuid, "~> 1.1.8"} - ] - end -end diff --git a/farmbot_ext/mix.lock b/farmbot_ext/mix.lock deleted file mode 100644 index 3714d7c78..000000000 --- a/farmbot_ext/mix.lock +++ /dev/null @@ -1,56 +0,0 @@ -%{ - "amqp": {:hex, :amqp, "1.6.0", "736d976f53780bcee72ccc50f7eb36e3d5881354480b1e34ceac84e3bbd954e9", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm", "b8168919ea1f1571a68349421e6501d1db7f559c4db3b8324ae90dbd3e2c1c4a"}, - "amqp_client": {:hex, :amqp_client, "3.8.9", "42fb24cfa606f87f77e84604c1ad896c26c236228196a294a07f88f8d2982695", [:make, :rebar3], [{:rabbit_common, "3.8.9", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm", "8ad70be479d2b8c7882aa2908245b490960fe5c619d2edd56eb24f90e1132b60"}, - "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, - "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, - "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, - "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, - "credentials_obfuscation": {:hex, :credentials_obfuscation, "2.2.0", "f8040672ff9644ccaefc40ffb8ec33ed80ac77df84ac5f206a1c079ca2aacc9d", [:rebar3], [], "hexpm", "52dd8585a2123e6e259253a7f4f849f1584404bd25cdfaf18247e198065c601e"}, - "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "5f0a16a58312a610d5eb0b07506280c65f5137868ad479045f2a2dc4ced80550"}, - "decimal": {:hex, :decimal, "1.9.0", "83e8daf59631d632b171faabafb4a9f4242c514b0a06ba3df493951c08f64d07", [:mix], [], "hexpm", "b1f2343568eed6928f3e751cf2dffde95bfaa19dd95d09e8a9ea92ccfd6f7d85"}, - "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "49496d63267bc1a4614ffd5f67c45d9fc3ea62701a6797975bc98bc156d2763f"}, - "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, - "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "f1e20ddf41713b4db247443a3bea9045c4103b27c0e64b0c21ec50edde51fba8"}, - "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, - "erlex": {:hex, :erlex, "0.2.1", "cee02918660807cbba9a7229cae9b42d1c6143b768c781fa6cee1eaf03ad860b", [:mix], [], "hexpm", "df65aa8e1e926941982b208f5957158a52b21fbba06ba8141fff2b8c5ce87574"}, - "esqlite": {:hex, :esqlite, "0.3.0", "f6c96fae1236fd8da73da904278b820c807aee4f41c7c837c33de1c2edb857fb", [:rebar3], [], "hexpm", "0cce04862887c4a4c39d08e6ab661b2537da099a145aeaab93f06224574b6439"}, - "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, - "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, - "extty": {:hex, :extty, "0.2.1", "4da6d78d41f0a9ff9980d82968476b4277ac0afa227d2ed91af0ffcbac2f451b", [:mix], [], "hexpm", "26b2e495c14501d4ae24c7dffba199f6abf0a0f69dcfd07db62f421952442f05"}, - "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, - "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, - "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, - "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, - "jsx": {:hex, :jsx, "2.11.0", "08154624050333919b4ac1b789667d5f4db166dc50e190c4d778d1587f102ee0", [:rebar3], [], "hexpm", "eed26a0d04d217f9eecefffb89714452556cf90eb38f290a27a4d45b9988f8c0"}, - "lager": {:hex, :lager, "3.8.0", "3402b9a7e473680ca179fc2f1d827cab88dd37dd1e6113090c6f45ef05228a1c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "f6cb541b688eab60730d8d286eb77256a5a9ad06eac10d43beaf55d07e68bbb6"}, - "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "mimic": {:hex, :mimic, "1.5.1", "085f7ebfeb5b579a13a167aec3c712d71fecfc6cb8b298c0dd3056f97ea2c2a0", [:mix], [], "hexpm", "33a50ef9ff38f8f24b2586d52e529981a3ba2b8d061c872084aff0e993bf4bd5"}, - "mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"}, - "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, - "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, - "rabbit_common": {:hex, :rabbit_common, "3.8.9", "5a80cb825013ada01921db6f20143295eff8c43284b96a4a40e52576397c9322", [:make, :rebar3], [{:credentials_obfuscation, "2.2.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:jsx, "2.11.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.8.0", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.5.1", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm", "e8138d2cf3fcef8e1c37f5e2c0fd39ca052b1fe98d21036508ed58f7edece33d"}, - "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"}, - "recon": {:hex, :recon, "2.5.1", "430ffa60685ac1efdfb1fe4c97b8767c92d0d92e6e7c3e8621559ba77598678a", [:mix, :rebar3], [], "hexpm", "5721c6b6d50122d8f68cccac712caa1231f97894bab779eff5ff0f886cb44648"}, - "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm", "ba952bfa35b374e1e5d84bc5f5efe8360c6f99dc93b3118f714a9a2dff6c9e19"}, - "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm", "a588e8e4ab9570c32a03605fabff86f0fee1040530d33edc4fc4392db4d81700"}, - "sqlitex": {:hex, :sqlitex, "1.5.1", "0242c9a7602180b4f974315e6776c48d4ba211e9f4c5774dc886f15dc1a2edb3", [:mix], [{:decimal, "~> 1.7", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.3.0", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm", "da8aa07813decaf2a5fa0930f24a2ccdc88460548753c14fa87e7a7af9768727"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, - "tesla": {:hex, :tesla, "1.4.3", "f5a494e08fb1abe4fd9c28abb17f3d9b62b8f6fc492860baa91efb1aab61c8a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e0755bb664bf4d664af72931f320c97adbf89da4586670f4864bf259b5750386"}, - "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, - "tortoise": {:hex, :tortoise, "0.10.0", "d8821b9a5052355ca61d9fa784652f435997fa98b210f88565c98f3494605efd", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "926d97b03cd0d2f6e0e1ebf06c1efa50101de96d0317dea5604c1c9e43e66735"}, - "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, - "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, -} diff --git a/farmbot_ext/test/farmbot_ext/http_test.exs b/farmbot_ext/test/farmbot_ext/http_test.exs deleted file mode 100644 index c76d53f99..000000000 --- a/farmbot_ext/test/farmbot_ext/http_test.exs +++ /dev/null @@ -1,9 +0,0 @@ -defmodule FarmbotTelemetry.HTTPTest do - use ExUnit.Case - alias FarmbotTelemetry.HTTP - - test "request/4" do - params = {'http://typo.farm.bot', []} - assert {:error, _error} = HTTP.request(:head, params, [], []) - end -end diff --git a/farmbot_ext/test/test_helper.exs b/farmbot_ext/test/test_helper.exs deleted file mode 100644 index 6b7cc8d24..000000000 --- a/farmbot_ext/test/test_helper.exs +++ /dev/null @@ -1,103 +0,0 @@ -Application.ensure_all_started(:farmbot) -Application.ensure_all_started(:mimic) - -[ - Ecto.Changeset, - ExTTY, - FarmbotCore.Asset.Command, - FarmbotCore.Asset.Private, - FarmbotCore.Asset.Repo, - FarmbotCore.BotState, - FarmbotCore.BotStateNG, - FarmbotCore.Celery.SysCalls, - FarmbotCore.Celery.SysCalls.Stubs, - FarmbotCore.Config, - FarmbotCore.Leds, - FarmbotCore.LogExecutor, - FarmbotCore.Logger, - FarmbotExt.API, - FarmbotExt.API.Preloader, - FarmbotExt.API.Reconciler, - FarmbotExt.API.SyncGroup, - FarmbotExt.APIFetcher, - FarmbotExt.Bootstrap.Authorization, - FarmbotExt.Bootstrap.DropPasswordSupport, - FarmbotExt.EagerLoader, - FarmbotExt.EagerLoader.Supervisor, - FarmbotExt.MQTT, - FarmbotExt.MQTT.LogHandlerSupport, - FarmbotExt.MQTT.Support, - FarmbotExt.MQTT.SyncHandlerSupport, - FarmbotExt.MQTT.TerminalHandlerSupport, - FarmbotExt.MQTT.TopicSupervisor, - FarmbotExt.Time, - FarmbotTelemetry, - FarmbotTelemetry.HTTP, - Tortoise -] -|> Enum.map(&Mimic.copy/1) - -timeout = System.get_env("EXUNIT_TIMEOUT") || "5000" -System.put_env("LOG_SILENCE", "true") - -ExUnit.configure( - max_cases: 1, - assert_receive_timeout: String.to_integer(timeout) -) - -ExUnit.start() - -# Use this to stub out calls to `state.reset.reset()` in firmware. -defmodule StubReset do - def reset(), do: :ok -end - -defmodule NoOp do - use GenServer - - def new(opts \\ []) do - {:ok, pid} = start_link(opts) - pid - end - - def stop(pid) do - _ = Process.unlink(pid) - :ok = GenServer.stop(pid, :normal, 3_000) - end - - def last_message(pid) do - :sys.get_state(pid) - end - - def start_link(opts) do - GenServer.start_link(__MODULE__, [], opts) - end - - def init([]) do - {:ok, :no_message_yet} - end - - def handle_info(next_message, _last_message) do - {:noreply, next_message} - end -end - -defmodule SimpleCounter do - def new(starting_value \\ 0) do - Agent.start_link(fn -> starting_value end) - end - - def get_count(pid) do - Agent.get(pid, fn count -> count end) - end - - def incr(pid, by \\ 1) do - Agent.update(pid, fn count -> count + by end) - pid - end - - # Increment the counter by one and get the current count. - def bump(pid, by \\ 1) do - pid |> incr(by) |> get_count() - end -end diff --git a/farmbot_ext/vendor/rsa.ex b/farmbot_ext/vendor/rsa.ex deleted file mode 100644 index 7f3d9f238..000000000 --- a/farmbot_ext/vendor/rsa.ex +++ /dev/null @@ -1,18 +0,0 @@ -defmodule RSA do - # Encrypt using the public key - def encrypt(text, {:public, key}) do - text |> :public_key.encrypt_public(key) - end - - # Decode a key from its text representation to a PEM structure - def decode_key(text) do - [entry] = :public_key.pem_decode(text) - :public_key.pem_entry_decode(entry) - end - - # ONLY NEEDED FOR TESTS AND VERIFICATION. - # Decrypt using the private key - def decrypt(cyphertext, {:private, key}) do - cyphertext |> :public_key.decrypt_private(key) - end -end diff --git a/farmbot_os/.formatter.exs b/farmbot_os/.formatter.exs deleted file mode 100644 index 675b30f8a..000000000 --- a/farmbot_os/.formatter.exs +++ /dev/null @@ -1,11 +0,0 @@ -[ - import_deps: [:ecto], - line_length: 80, - inputs: [ - "*.{ex,exs}", - "{config,priv,test}/**/*.{ex,exs}", - "lib/**/*.{ex,exs}", - "platform/**/*.{ex,exs}" - ], - subdirectories: ["priv/*/migrations"] -] diff --git a/farmbot_os/.gitignore b/farmbot_os/.gitignore deleted file mode 100644 index dca30926f..000000000 --- a/farmbot_os/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# The directory Mix will write compiled artifacts to. -/_build/ - -# If you run "mix test --cover", coverage assets end up here. -/cover/ - -# The directory Mix downloads your dependencies sources to. -/deps/ - -# Where 3rd-party dependencies like ExDoc output generated docs. -/doc/ - -# Ignore .fetch files in case you like to edit your project deps locally. -/.fetch - -# If the VM crashes, it generates a dump, let's ignore it too. -erl_crash.dump -*.sqlite3 -auth_secret.exs -log -*.csv -*.coverdata diff --git a/farmbot_os/.tool-versions b/farmbot_os/.tool-versions deleted file mode 120000 index d54b92fcb..000000000 --- a/farmbot_os/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -../.tool-versions \ No newline at end of file diff --git a/farmbot_os/Makefile b/farmbot_os/Makefile deleted file mode 100644 index 15cb534bb..000000000 --- a/farmbot_os/Makefile +++ /dev/null @@ -1,50 +0,0 @@ -# Set Erlang-specific compile and linker flags -ERL_CFLAGS ?= -I$(ERL_EI_INCLUDE_DIR) -ERL_LDFLAGS ?= -L$(ERL_EI_LIBDIR) -lei - -CFLAGS += -fPIC --std=c11 -LDFLAGS += -fPIC -shared - -ifeq ($(ERL_EI_INCLUDE_DIR),) -$(warning ERL_EI_INCLUDE_DIR not set. Invoke via mix) -endif - -ESQLITE_SRC = $(MIX_DEPS_PATH)/esqlite/c_src -ESQLITE_BUILD = $(MIX_BUILD_PATH)/lib/esqlite/obj -ESQLITE_PREFIX = $(MIX_BUILD_PATH)/lib/esqlite/priv - -.PHONY: all clean - -SQLITE_CFLAGS := -DSQLITE_THREADSAFE=1 \ --DSQLITE_USE_URI \ --DSQLITE_ENABLE_FTS3 \ --DSQLITE_ENABLE_FTS3_PARENTHESIS - -all: $(ESQLITE_BUILD) \ - $(ESQLITE_PREFIX) \ - $(ESQLITE_PREFIX)/esqlite3_nif.so - -clean: - $(RM) $(ESQLITE_PREFIX)/*.so - -## ESQLITE NIF HACK - -$(ESQLITE_PREFIX)/esqlite3_nif.so: $(ESQLITE_BUILD)/sqlite3.o $(ESQLITE_BUILD)/queue.o $(ESQLITE_BUILD)/esqlite3_nif.o - $(CC) -o $@ $(ERL_LDFLAGS) $(LDFLAGS) $^ - -$(ESQLITE_BUILD)/esqlite3_nif.o: $(ESQLITE_SRC)/esqlite3_nif.c - $(CC) -c $(ERL_CFLAGS) $(CFLAGS) $(SQLITE_CFLAGS) -o $@ $< - -$(ESQLITE_BUILD)/queue.o: $(ESQLITE_SRC)/queue.c - $(CC) -c $(ERL_CFLAGS) $(CFLAGS) $(SQLITE_CFLAGS) -o $@ $< - -$(ESQLITE_BUILD)/sqlite3.o: $(ESQLITE_SRC)/sqlite3.c - $(CC) -c $(CFLAGS) $(SQLITE_CFLAGS) -o $@ $< - -## DIRECTORIES - -$(ESQLITE_BUILD): - mkdir -p $(ESQLITE_BUILD) - -$(ESQLITE_PREFIX): - mkdir -p $(ESQLITE_PREFIX) diff --git a/farmbot_os/config/config.exs b/farmbot_os/config/config.exs deleted file mode 100644 index 6af899e6a..000000000 --- a/farmbot_os/config/config.exs +++ /dev/null @@ -1,91 +0,0 @@ -use Mix.Config - -config :farmbot_core, - Elixir.FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey, - ssh_handler: FarmbotCore.PublicKeyHandler.StubSSHHandler - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding, - gpio_handler: FarmbotCore.PinBindingWorker.StubGPIOHandler - -config :farmbot_core, FarmbotCore.Leds, - gpio_handler: FarmbotCore.Leds.StubHandler - -# Customize non-Elixir parts of the firmware. See -# https://hexdocs.pm/nerves/advanced-configuration.html for details. -config :nerves, :firmware, rootfs_overlay: "rootfs_overlay" - -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_core, FarmbotCore.Celery.SysCalls, sys_calls: FarmbotOS.SysCalls - -config :farmbot_core, FarmbotCore.BotState.FileSystem, - root_dir: "/tmp/farmbot_state" - -config :ecto, json_library: FarmbotCore.JSON - -config :farmbot_core, - ecto_repos: [ - FarmbotCore.Config.Repo, - FarmbotCore.Logger.Repo, - FarmbotCore.Asset.Repo - ] - -config :farmbot_ext, FarmbotExt.API.Preloader, - preloader_impl: FarmbotExt.API.Preloader.HTTP - -config :farmbot, FarmbotOS.FileSystem, data_path: "/tmp/farmbot" - -config :farmbot, FarmbotOS.System, - system_tasks: FarmbotOS.Platform.Host.SystemTasks - -config :farmbot, FarmbotOS.Configurator, - network_layer: FarmbotOS.Configurator.FakeNetworkLayer - -config :farmbot, FarmbotOS.Platform.Supervisor, - platform_children: [ - FarmbotOS.Platform.Host.Configurator - ] - -config :logger, - handle_sasl_reports: false, - handle_otp_reports: false - -rollbar_token = System.get_env("ROLLBAR_TOKEN") - -if rollbar_token && Mix.env() != :test do - IO.puts("=== ROLLBAR IS ENABLED! ===") - - config :rollbax, - access_token: rollbar_token, - environment: "production", - enable_crash_reports: true, - custom: %{fbos_version: Mix.Project.config()[:version]} -else - config :rollbax, enabled: false -end - -if Mix.target() == :host do - if File.exists?("config/host/#{Mix.env()}.exs") do - import_config("host/#{Mix.env()}.exs") - end -else - import_config("target/#{Mix.env()}.exs") - - import_config("target/#{Mix.target()}.exs") -end - -if Mix.env() == :test do - config :farmbot_os, - :reconciler, - FarmbotExt.API.TestReconciler -end diff --git a/farmbot_os/config/host/dev.exs b/farmbot_os/config/host/dev.exs deleted file mode 100644 index 2dab18227..000000000 --- a/farmbot_os/config/host/dev.exs +++ /dev/null @@ -1,40 +0,0 @@ -use Mix.Config - -data_path = Path.join(["/", "tmp", "farmbot"]) -File.mkdir_p(data_path) - -config :farmbot_ext, - data_path: data_path - -config :farmbot_core, FarmbotCore.Config.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "config-#{Mix.env()}.sqlite3") - -config :farmbot_core, FarmbotCore.Logger.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3") - -config :farmbot_core, FarmbotCore.Asset.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3") - -config :farmbot, FarmbotOS.Init.Supervisor, - init_children: [ - FarmbotOS.Platform.Host.Configurator - ] - -config :farmbot, - ecto_repos: [ - FarmbotCore.Config.Repo, - FarmbotCore.Logger.Repo, - FarmbotCore.Asset.Repo - ] - -config :logger, - backends: [:console] diff --git a/farmbot_os/config/host/test.exs b/farmbot_os/config/host/test.exs deleted file mode 100644 index 1d213e826..000000000 --- a/farmbot_os/config/host/test.exs +++ /dev/null @@ -1,40 +0,0 @@ -use Mix.Config - -data_path = Path.join(["/", "tmp", "farmbot"]) -File.mkdir_p(data_path) - -config :farmbot_ext, - data_path: data_path - -config :farmbot_core, FarmbotCore.Config.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: Path.join(data_path, "config-#{Mix.env()}.sqlite3") - -config :farmbot_core, FarmbotCore.Logger.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3") - -config :farmbot_core, FarmbotCore.Asset.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3") - -config :farmbot, - ecto_repos: [ - FarmbotCore.Config.Repo, - FarmbotCore.Logger.Repo, - FarmbotCore.Asset.Repo - ], - platform_children: [ - {Farmbot.Platform.Host.Configurator, []} - ] - -config :farmbot, FarmbotOS.Configurator, - data_layer: FarmbotOS.Configurator.ConfigDataLayer, - network_layer: FarmbotOS.Configurator.FakeNetworkLayer - -config :plug, :validate_header_keys_during_test, true - -config :ex_unit, capture_logs: true diff --git a/farmbot_os/config/target/dev.exs b/farmbot_os/config/target/dev.exs deleted file mode 100644 index 2d623e852..000000000 --- a/farmbot_os/config/target/dev.exs +++ /dev/null @@ -1,101 +0,0 @@ -use Mix.Config -local_file = Path.join(System.user_home!(), ".ssh/id_rsa.pub") -local_key = if File.exists?(local_file), do: [File.read!(local_file)], else: [] - -config :nerves_firmware_ssh, - authorized_keys: local_key - -config :vintage_net, - regulatory_domain: "00", - persistence: VintageNet.Persistence.Null, - config: [ - {"wlan0", %{type: VintageNet.Technology.Null}} - ] - -config :mdns_lite, - mdns_config: %{ - host: :hostname, - ttl: 120 - }, - services: [ - # service type: _http._tcp.local - used in match - %{ - name: "Web Server", - protocol: "http", - transport: "tcp", - port: 80 - }, - # service_type: _ssh._tcp.local - used in match - %{ - name: "Secure Socket", - protocol: "ssh", - transport: "tcp", - port: 22 - } - ] - -config :shoehorn, - init: [ - :nerves_runtime, - :vintage_net, - :nerves_firmware_ssh, - :farmbot_core, - :farmbot_ext - ], - handler: FarmbotOS.Platform.Target.ShoehornHandler, - app: :farmbot - -config :tzdata, :autoupdate, :disabled - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey, - ssh_handler: FarmbotOS.Platform.Target.SSHConsole - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding, - gpio_handler: FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler - -config :farmbot_core, FarmbotCore.Leds, - gpio_handler: FarmbotOS.Platform.Target.Leds.CircuitsHandler - -data_path = Path.join("/", "root") - -config :farmbot, FarmbotOS.FileSystem, data_path: data_path - -config :farmbot_core, FarmbotCore.Config.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "config-prod.sqlite3") - -config :farmbot_core, FarmbotCore.Logger.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "logs-prod.sqlite3") - -config :farmbot_core, FarmbotCore.Asset.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "asset-prod.sqlite3") - -config :farmbot_telemetry, - file: to_charlist(Path.join(data_path, 'farmbot-telemetry.dets')) - -config :farmbot, FarmbotOS.Platform.Supervisor, - platform_children: [ - FarmbotOS.Platform.Target.Network.Supervisor, - FarmbotOS.Platform.Target.SSHConsole, - FarmbotOS.Platform.Target.InfoWorker.Supervisor - ] - -config :farmbot, FarmbotOS.Configurator, - network_layer: FarmbotOS.Platform.Target.Configurator.VintageNetworkLayer - -config :farmbot, FarmbotOS.System, - system_tasks: FarmbotOS.Platform.Target.SystemTasks - -config :logger, backends: [RingLogger] - -config :logger, RingLogger, - max_size: 1024, - color: [enabled: true] diff --git a/farmbot_os/config/target/prod.exs b/farmbot_os/config/target/prod.exs deleted file mode 100644 index 07747a237..000000000 --- a/farmbot_os/config/target/prod.exs +++ /dev/null @@ -1,104 +0,0 @@ -use Mix.Config -local_file = Path.join(System.user_home!(), ".ssh/id_rsa.pub") -local_key = if File.exists?(local_file), do: [File.read!(local_file)], else: [] - -config :nerves_firmware_ssh, - authorized_keys: local_key - -config :vintage_net, - regulatory_domain: "00", - persistence: VintageNet.Persistence.Null, - config: [ - {"wlan0", %{type: VintageNet.Technology.Null}} - ] - -config :mdns_lite, - mdns_config: %{ - host: :hostname, - ttl: 120 - }, - services: [ - # service type: _http._tcp.local - used in match - %{ - name: "Configurator", - protocol: "http", - transport: "tcp", - port: 80 - }, - # service_type: _ssh._tcp.local - used in match - %{ - name: "Secure Socket", - protocol: "ssh", - transport: "tcp", - port: 22 - } - ] - -config :shoehorn, - init: [ - :nerves_runtime, - :vintage_net, - :nerves_firmware_ssh, - :farmbot_core, - :farmbot_ext - ], - handler: FarmbotOS.Platform.Target.ShoehornHandler, - app: :farmbot - -config :tzdata, :autoupdate, :disabled - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey, - ssh_handler: FarmbotOS.Platform.Target.SSHConsole - -config :farmbot_core, FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding, - gpio_handler: FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler - -config :farmbot_core, FarmbotCore.Leds, - gpio_handler: FarmbotOS.Platform.Target.Leds.CircuitsHandler - -data_path = Path.join("/", "root") - -config :farmbot, FarmbotOS.FileSystem, data_path: data_path - -config :farmbot_core, FarmbotCore.Config.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "config-#{Mix.env()}.sqlite3") - -config :farmbot_core, FarmbotCore.Logger.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3") - -config :farmbot_core, FarmbotCore.Asset.Repo, - adapter: Sqlite.Ecto2, - loggers: [], - pool_size: 1, - database: Path.join(data_path, "asset-#{Mix.env()}.sqlite3") - -config :farmbot_telemetry, - file: to_charlist(Path.join(data_path, 'farmbot-telemetry.dets')) - -config :farmbot, FarmbotOS.Platform.Supervisor, - platform_children: [ - FarmbotOS.Platform.Target.Network.Supervisor, - FarmbotOS.Platform.Target.SSHConsole, - FarmbotOS.Platform.Target.InfoWorker.Supervisor - ] - -config :farmbot, FarmbotOS.Configurator, - network_layer: FarmbotOS.Platform.Target.Configurator.VintageNetworkLayer - -config :farmbot, FarmbotOS.System, - system_tasks: FarmbotOS.Platform.Target.SystemTasks - -config :logger, - backends: [RingLogger], - handle_otp_reports: true, - handle_sasl_reports: true - -config :logger, RingLogger, - max_size: 1024, - color: [enabled: true] diff --git a/farmbot_os/config/target/rpi.exs b/farmbot_os/config/target/rpi.exs deleted file mode 100644 index 499d122e0..000000000 --- a/farmbot_os/config/target/rpi.exs +++ /dev/null @@ -1,6 +0,0 @@ -use Mix.Config - -config :farmbot, FarmbotOS.Init.Supervisor, - init_children: [ - FarmbotOS.Platform.Target.RTCWorker - ] diff --git a/farmbot_os/config/target/rpi3.exs b/farmbot_os/config/target/rpi3.exs deleted file mode 100644 index 499d122e0..000000000 --- a/farmbot_os/config/target/rpi3.exs +++ /dev/null @@ -1,6 +0,0 @@ -use Mix.Config - -config :farmbot, FarmbotOS.Init.Supervisor, - init_children: [ - FarmbotOS.Platform.Target.RTCWorker - ] diff --git a/farmbot_os/lib/farmbot_os.ex b/farmbot_os/lib/farmbot_os.ex deleted file mode 100644 index 02bdecd65..000000000 --- a/farmbot_os/lib/farmbot_os.ex +++ /dev/null @@ -1,19 +0,0 @@ -defmodule FarmbotOS do - # See https://hexdocs.pm/elixir/Application.html - # for more information on OTP Applications - @moduledoc false - - use Application - - def start(_type, _args) do - children = [ - {FarmbotOS.Configurator.Supervisor, []}, - {FarmbotOS.Init.Supervisor, []}, - {FarmbotOS.Platform.Supervisor, []}, - {FarmbotOS.EasterEggs, []} - ] - - opts = [strategy: :one_for_one, name: __MODULE__] - Supervisor.start_link(children, opts) - end -end diff --git a/farmbot_os/lib/farmbot_os/easter_eggs.ex b/farmbot_os/lib/farmbot_os/easter_eggs.ex deleted file mode 100644 index 863c8166d..000000000 --- a/farmbot_os/lib/farmbot_os/easter_eggs.ex +++ /dev/null @@ -1,60 +0,0 @@ -defmodule FarmbotOS.EasterEggs do - @moduledoc """ - Process responsible for dispatching funny logs every once in a while - """ - - use GenServer - alias FarmbotCore.{Asset, JSON} - require FarmbotCore.Logger - - @doc false - def start_link(args) do - GenServer.start_link(__MODULE__, args, name: __MODULE__) - end - - def force do - GenServer.call(__MODULE__, :force) - end - - def init([]) do - timer = generate_timer(self()) - {:ok, %{timer: timer}} - end - - def handle_info(:timer, state) do - %{"nouns" => noun_list, "verbs" => verb_list} = load_data() - verb = Enum.random(verb_list) - timer = generate_timer(self()) - - nouns = - Enum.reduce(noun_list, [], fn map, acc -> - [{key, val}] = Map.to_list(map) - [{:"#{key}", val} | acc] - end) - - message = EEx.eval_string(verb, nouns) - bot_name = Asset.device().name - FarmbotCore.Logger.fun(3, Enum.join([bot_name, message], " ")) - {:noreply, %{state | timer: timer}} - end - - def handle_call(:force, _, state) do - FarmbotExt.Time.cancel_timer(state.timer) - send(self(), :timer) - {:reply, :ok, %{state | timer: nil}} - end - - def load_data do - Path.join(:code.priv_dir(:farmbot), "easter_eggs.json") - |> File.read!() - |> JSON.decode!() - end - - @ms_in_one_hour 3.6e+6 |> round() - @ms_in_sixty_hours @ms_in_one_hour * 60 - - defp generate_timer(pid) do - time = Enum.random(@ms_in_one_hour..@ms_in_sixty_hours) - Process.send_after(pid, :timer, time) - end -end diff --git a/farmbot_os/mix.exs b/farmbot_os/mix.exs deleted file mode 100644 index 889940bb3..000000000 --- a/farmbot_os/mix.exs +++ /dev/null @@ -1,136 +0,0 @@ -defmodule FarmbotOS.MixProject do - use Mix.Project - - @all_targets [:rpi3, :rpi] - @version Path.join([__DIR__, "..", "VERSION"]) - |> File.read!() - |> String.trim() - @branch System.cmd("git", ~w"rev-parse --abbrev-ref HEAD") - |> elem(0) - |> String.trim() - @commit System.cmd("git", ~w"rev-parse --verify HEAD") - |> elem(0) - |> String.trim() - System.put_env("NERVES_FW_VCS_IDENTIFIER", @commit) - System.put_env("NERVES_FW_MISC", @branch) - - @elixir_version Path.join([__DIR__, "..", "ELIXIR_VERSION"]) - |> File.read!() - |> String.trim() - - System.put_env("NERVES_FW_VCS_IDENTIFIER", @commit) - - def project do - [ - app: :farmbot, - elixir: @elixir_version, - version: @version, - branch: @branch, - commit: @commit, - releases: [{:farmbot, release()}], - elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], - archives: [nerves_bootstrap: "~> 1.10"], - start_permanent: Mix.env() == :prod, - build_embedded: false, - compilers: [:elixir_make | Mix.compilers()], - aliases: [loadconfig: [&bootstrap/1]], - elixirc_paths: elixirc_paths(Mix.env(), Mix.target()), - deps_path: "deps/#{Mix.target()}", - build_path: "_build/#{Mix.target()}", - deps: deps(), - test_coverage: [tool: ExCoveralls], - preferred_cli_target: [run: :host, test: :host], - preferred_cli_env: [ - coveralls: :test, - "coveralls.detail": :test, - "coveralls.post": :test, - "coveralls.html": :test - ], - source_url: "https://github.com/Farmbot/farmbot_os", - homepage_url: "http://farmbot.io", - docs: [ - logo: "../farmbot_os/priv/static/farmbot_logo.png", - extras: Path.wildcard("../docs/**/*.md") - ] - ] - end - - def release do - [ - overwrite: true, - cookie: "democookie", - include_erts: &Nerves.Release.erts/0, - strip_beams: false, - steps: [&Nerves.Release.init/1, :assemble] - ] - end - - # Starting nerves_bootstrap adds the required aliases to Mix.Project.config() - # Aliases are only added if MIX_TARGET is set. - def bootstrap(args) do - Application.start(:nerves_bootstrap) - Mix.Task.run("loadconfig", args) - end - - # Run "mix help compile.app" to learn about applications. - def application do - [ - mod: {FarmbotOS, []}, - extra_applications: [:logger, :runtime_tools, :eex, :rollbax] - ] - end - - # Run "mix help deps" to learn about dependencies. - defp deps do - [ - {:busybox, "~> 0.1.5", targets: @all_targets}, - {:circuits_gpio, "~> 0.4.8", targets: @all_targets}, - {:circuits_i2c, "~> 0.3.9", targets: @all_targets}, - {:cors_plug, "~> 2.0.3", targets: @all_targets}, - {:dns, "~> 2.3"}, - {:elixir_make, "~> 0.6.2", runtime: false}, - {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false}, - {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, - {:farmbot_core, path: "../farmbot_core", env: Mix.env()}, - {:farmbot_ext, path: "../farmbot_ext", env: Mix.env()}, - {:farmbot_system_rpi, - git: "https://github.com/FarmBot/farmbot_system_rpi.git", - ref: "v1.16.2-farmbot.1", - runtime: false, - targets: :rpi}, - {:farmbot_system_rpi3, - git: "https://github.com/FarmBot/farmbot_system_rpi3.git", - tag: "v1.16.2-farmbot.1", - runtime: false, - targets: :rpi3}, - {:farmbot_telemetry, path: "../farmbot_telemetry", env: Mix.env()}, - {:luerl, github: "rvirding/luerl", tag: "1.0"}, - {:mdns_lite, "~> 0.8", targets: @all_targets}, - {:nerves_firmware_ssh, "~> 0.4.6", targets: @all_targets}, - {:nerves_runtime, "~> 0.11.6", targets: @all_targets}, - {:nerves_time, "~> 0.4.3"}, - {:nerves, "~> 1.7.11", runtime: false}, - {:phoenix_html, "~> 2.14.3"}, - {:plug_cowboy, "~> 2.5.2"}, - {:ring_logger, "~> 0.8.2"}, - {:rollbax, ">= 0.0.0"}, - {:shoehorn, "~> 0.7"}, - {:toolshed, "~> 0.2.22", targets: @all_targets}, - {:vintage_net_ethernet, "~> 0.10.1", targets: @all_targets}, - {:vintage_net_wifi, "~> 0.10.1", targets: @all_targets}, - {:vintage_net, "~> 0.11", targets: @all_targets} - ] - end - - defp elixirc_paths(:test, :host) do - ["./lib", "./platform/host", "./test/support"] - end - - defp elixirc_paths(_, :host) do - ["./lib", "./platform/host"] - end - - defp elixirc_paths(_env, _target) do - ["./lib", "./platform/target"] - end -end diff --git a/farmbot_os/mix.lock b/farmbot_os/mix.lock deleted file mode 100644 index b65296854..000000000 --- a/farmbot_os/mix.lock +++ /dev/null @@ -1,105 +0,0 @@ -%{ - "amqp": {:hex, :amqp, "1.6.0", "736d976f53780bcee72ccc50f7eb36e3d5881354480b1e34ceac84e3bbd954e9", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm", "b8168919ea1f1571a68349421e6501d1db7f559c4db3b8324ae90dbd3e2c1c4a"}, - "amqp_client": {:hex, :amqp_client, "3.8.9", "42fb24cfa606f87f77e84604c1ad896c26c236228196a294a07f88f8d2982695", [:make, :rebar3], [{:rabbit_common, "3.8.9", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm", "8ad70be479d2b8c7882aa2908245b490960fe5c619d2edd56eb24f90e1132b60"}, - "beam_notify": {:hex, :beam_notify, "0.2.1", "64f94f5b486b4cc96ef10a633188560cdd6ae2fccaf6fd746851cdc12b85d5f1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "d1b3a8d280867c43c2c53e61556ca5ad87e0907ad25797d2c753bac5d8b3dc44"}, - "busybox": {:hex, :busybox, "0.1.5", "a86e8007469d9422c8c7808c2d978688f60e42c77b14f2a849bc4a1223729a8b", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4da1fd2e47ea25a744506520241b201302fef841833a7cb0ed4dace94be23d9f"}, - "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, - "circuits_gpio": {:hex, :circuits_gpio, "0.4.8", "75a62b07131f119c0ffa1dd49f79fbe29c46fd39b20ef0acc036d449fb780b89", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "05e341a5de7e9181a0ee6b3281bd2dc278ae4651825e95c9e83c9eabc421448e"}, - "circuits_i2c": {:hex, :circuits_i2c, "0.3.9", "746a599ac06f8d31572143a8c51e1bc787246c173669940dc23e078907fb13e1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "c6d75387637a4fbae77cf37af45000fe23763eb8104cc50e7aae532bec46e91d"}, - "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, - "circular_buffer": {:hex, :circular_buffer, "0.4.0", "a51ea76bb03c4a38207934264bcc600018ead966728ca80da731458c5f940f8b", [:mix], [], "hexpm", "c604b19f2101982b63264e2ed90c6fb0fe502540b6af83ce95135ac9b6f2d847"}, - "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, - "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm", "4a0850c9be22a43af9920a71ab17c051f5f7d45c209e40269a1938832510e4d9"}, - "cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"}, - "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, - "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, - "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, - "credentials_obfuscation": {:hex, :credentials_obfuscation, "2.2.0", "f8040672ff9644ccaefc40ffb8ec33ed80ac77df84ac5f206a1c079ca2aacc9d", [:rebar3], [], "hexpm", "52dd8585a2123e6e259253a7f4f849f1584404bd25cdfaf18247e198065c601e"}, - "db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "5f0a16a58312a610d5eb0b07506280c65f5137868ad479045f2a2dc4ced80550"}, - "decimal": {:hex, :decimal, "1.9.0", "83e8daf59631d632b171faabafb4a9f4242c514b0a06ba3df493951c08f64d07", [:mix], [], "hexpm", "b1f2343568eed6928f3e751cf2dffde95bfaa19dd95d09e8a9ea92ccfd6f7d85"}, - "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "49496d63267bc1a4614ffd5f67c45d9fc3ea62701a6797975bc98bc156d2763f"}, - "dns": {:hex, :dns, "2.3.0", "3e750cf3e229898628a091fa7dca29524294db2962d0fc15696ac3a5cfff2315", [:mix], [{:socket, "~> 0.3.13", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm", "f3f1074409b4ecf6f93379a49fb0aef30a898f3093ea22b5c64a85e9f99ca6f8"}, - "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, - "ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm", "f1e20ddf41713b4db247443a3bea9045c4103b27c0e64b0c21ec50edde51fba8"}, - "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, - "erlex": {:hex, :erlex, "0.2.2", "cb0e6878fdf86dc63509eaf2233a71fa73fc383c8362c8ff8e8b6f0c2bb7017c", [:mix], [], "hexpm", "423a8f6ac70b77f0001c18adbff2b10413afed6901c2975aa33151a9c1263307"}, - "esqlite": {:hex, :esqlite, "0.2.5", "cab6d87aeb5f33d848b9bb8a21129e9512ea608f930d4c63576942d8f7d72218", [:rebar3], [], "hexpm", "3dd1163c8807b24a05ec4d88fd0f1bb286a2640ed340898fd792e3a67bb70f10"}, - "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, - "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, - "extty": {:hex, :extty, "0.2.1", "4da6d78d41f0a9ff9980d82968476b4277ac0afa227d2ed91af0ffcbac2f451b", [:mix], [], "hexpm", "26b2e495c14501d4ae24c7dffba199f6abf0a0f69dcfd07db62f421952442f05"}, - "farmbot_system_rpi": {:git, "https://github.com/FarmBot/farmbot_system_rpi.git", "6a6117d8c1dacc1d2f6a4ba1363436f2a4e62ad3", [ref: "v1.16.2-farmbot.1"]}, - "farmbot_system_rpi3": {:git, "https://github.com/FarmBot/farmbot_system_rpi3.git", "ae7d4459e3e40d35ec2367554618f8f92d2d3c2e", [tag: "v1.16.2-farmbot.1"]}, - "fwup": {:hex, :fwup, "0.3.0", "2c360815565fcbc945ebbb34b58f156efacb7f8d64766f1cb3426919bb3f41ea", [:mix], [], "hexpm", "d12990ebda7d485d0eb7502df7aa9a56e66f67b5eda158c352db1de48e3f0518"}, - "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, - "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, - "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, - "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, - "jsx": {:hex, :jsx, "2.11.0", "08154624050333919b4ac1b789667d5f4db166dc50e190c4d778d1587f102ee0", [:rebar3], [], "hexpm", "eed26a0d04d217f9eecefffb89714452556cf90eb38f290a27a4d45b9988f8c0"}, - "lager": {:hex, :lager, "3.8.0", "3402b9a7e473680ca179fc2f1d827cab88dd37dd1e6113090c6f45ef05228a1c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "f6cb541b688eab60730d8d286eb77256a5a9ad06eac10d43beaf55d07e68bbb6"}, - "luer": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, - "luerl": {:git, "https://github.com/rvirding/luerl.git", "836d08ad3287d73d9c91cb11a590de15a1761027", [tag: "1.0"]}, - "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "mdns_lite": {:hex, :mdns_lite, "0.8.3", "41ec5b6532a77737086f83b7ecd0a710bb2fe426221002d9b5ca9f279367a53c", [:mix], [{:vintage_net, "~> 0.7", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "d094a453e7c7c3167ab85257aeb69a7c534d905dfbe0df7b0f98ff2e509aac78"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "mimic": {:hex, :mimic, "1.5.1", "085f7ebfeb5b579a13a167aec3c712d71fecfc6cb8b298c0dd3056f97ea2c2a0", [:mix], [], "hexpm", "33a50ef9ff38f8f24b2586d52e529981a3ba2b8d061c872084aff0e993bf4bd5"}, - "mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"}, - "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, - "nerves": {:hex, :nerves, "1.7.11", "67820b7055b541ce20f7bce40672a06268673ba8c47576a76e703d537a136a74", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "79535d00928c81a93ea5311497b00f0ca7bc0a8aa405134d16597a02b2616e89"}, - "nerves_firmware_ssh": {:hex, :nerves_firmware_ssh, "0.4.6", "6f46f3af9698aa3683c7b98d444771efbce357b42d81de44e1076d99ccac8778", [:mix], [{:nerves_runtime, "~> 0.6", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm", "6c2be4c832160bcb90ade8e0d056d9d18d42306545cee3c52b25cb9865abcab5"}, - "nerves_hub": {:hex, :nerves_hub, "0.7.4", "0e104cad468c3d601ed423e116ea3422fbd31b7eedb263bcb2a5c489dca8b53b", [:mix], [{:fwup, "~> 0.3.0", [hex: :fwup, repo: "hexpm", optional: false]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:nerves_hub_cli, "~> 0.9", [hex: :nerves_hub_cli, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:phoenix_client, "~> 0.7", [hex: :phoenix_client, repo: "hexpm", optional: false]}, {:websocket_client, "~> 1.3", [hex: :websocket_client, repo: "hexpm", optional: false]}, {:x509, "~> 0.5", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "af1daf7e879f1175c9db1957340b1773f11a00e1c63eb591427d1bf7f3d40b47"}, - "nerves_hub_cli": {:hex, :nerves_hub_cli, "0.9.0", "ee02d6a4ce7706b7860df925a5a578c0856757123d7df56dfb38f85818f80aba", [:mix], [{:nerves_hub_user_api, "~> 0.6", [hex: :nerves_hub_user_api, repo: "hexpm", optional: false]}, {:pbcs, "~> 0.1", [hex: :pbcs, repo: "hexpm", optional: false]}, {:table_rex, "~> 2.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}, {:x509, "~> 0.3", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "0d0c2cf36c8e784534d6ba916587cbc282b00d317b577e8b2972eccd5ffe6314"}, - "nerves_hub_user_api": {:hex, :nerves_hub_user_api, "0.6.0", "14f7bd249275c647981e6601ebef909fd4036391aef010ff74d01d4799b90bdf", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.1 or ~> 1.3", [hex: :tesla, repo: "hexpm", optional: false]}, {:x509, "~> 0.3", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "de682a5f5302d1f602a92f82fe2380abd658640ca25f620a8e9854e883020ea0"}, - "nerves_runtime": {:hex, :nerves_runtime, "0.11.7", "eb4af57fbae6705d8edf7764173d860aa136d8df1b123f235b0754859e43c1c1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.8.0", [hex: :system_registry, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.1.1 or ~> 0.2.0 or ~> 0.3.0", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm", "68a6f93f4c73b05c0a7dccb6cb6e7624aad3fcbd4a6dfbe27233a1fef572ab65"}, - "nerves_system_br": {:hex, :nerves_system_br, "1.16.5", "8355a1d10cbcbb349623394b775acdcd5e874cd6ec9d1e1b0a5380018c29f6d1", [:mix], [], "hexpm", "a5e8dd4a308f09a06f3b1e47cbcec79cb31d0641349bba69437e98a05468896f"}, - "nerves_system_linter": {:hex, :nerves_system_linter, "0.3.0", "84e0f63c8ac196b16b77608bbe7df66dcf352845c4e4fb394bffd2b572025413", [:mix], [], "hexpm", "bffbdfb116bc72cde6e408c34c0670b199846e9a8f0953cc1c9f1eea693821a1"}, - "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, - "nerves_toolchain_armv6_nerves_linux_gnueabihf": {:hex, :nerves_toolchain_armv6_nerves_linux_gnueabihf, "1.4.3", "c75a3975388c3378deb72ed50178f34f8cc47b575b32546d22e522a577f6b8c0", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.8.4", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm", "33e3a174ff51f81bca3181560d33c065694828e8c8c72aada0b92a46ba7cfbe5"}, - "nerves_toolchain_armv7_nerves_linux_gnueabihf": {:hex, :nerves_toolchain_armv7_nerves_linux_gnueabihf, "1.4.3", "ff5b8fed2a71daea7ac07a5a0a6ecec7a4985d2a617a89ab073591d441d9cda4", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.8.4", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm", "ffefca61b7282a5a10032e61b6dab6758d24eee732c5d8c16fe6aada52dd099a"}, - "nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.8.4", "2f6b4153e3904502d117f9d957c12eaafd490e1d2bdf20a85328ada46a1350da", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}], "hexpm", "6194be9b1364fdc1db6b2a0e98fa8dcb94fe1af373dcf8149298d62ce9b1b369"}, - "nimble_csv": {:hex, :nimble_csv, "0.6.0", "a3673f26d41f986774fe6060e309615343d3cb83a6d435754d8b1fdbd5764879", [:mix], [], "hexpm", "b78e15f1c82fd963745ecc4073c47e1f0cdaf3622143342b8c30e9b5eaa546c6"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "one_dhcpd": {:hex, :one_dhcpd, "0.2.5", "ecec86e567839bde69717abb24c1ae5c74fcdc71beccfce541a0c3149aa980a4", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4d59693a9998c7dfd6d9f06c556ff23c73c817832f812205a6f09d38250b6dfa"}, - "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "pbcs": {:hex, :pbcs, "0.1.1", "199c7fd4af3351758378355909145a2d187c565555ed16bde30b5055114652ed", [:mix], [], "hexpm", "7bf2553c32bc7948959e599de0b39745ef988b0914fdb2cf89ea2bed569c1357"}, - "phoenix_client": {:hex, :phoenix_client, "0.10.0", "a77ace5495c400001808e96980673dd3b97b1048f296fd032991c52e8f5fe93d", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:websocket_client, "~> 1.3", [hex: :websocket_client, repo: "hexpm", optional: true]}], "hexpm", "9374a29a9f835125cec73a2b45086eedce8df6b4d7c5353fced11bb48a3d6800"}, - "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"}, - "plug": {:hex, :plug, "1.12.1", "645678c800601d8d9f27ad1aebba1fdb9ce5b2623ddb961a074da0b96c35187d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d57e799a777bc20494b784966dc5fbda91eb4a09f571f76545b72a634ce0d30b"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"}, - "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, - "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, - "rabbit_common": {:hex, :rabbit_common, "3.8.9", "5a80cb825013ada01921db6f20143295eff8c43284b96a4a40e52576397c9322", [:make, :rebar3], [{:credentials_obfuscation, "2.2.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:jsx, "2.11.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.8.0", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.5.1", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm", "e8138d2cf3fcef8e1c37f5e2c0fd39ca052b1fe98d21036508ed58f7edece33d"}, - "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, - "recon": {:hex, :recon, "2.5.1", "430ffa60685ac1efdfb1fe4c97b8767c92d0d92e6e7c3e8621559ba77598678a", [:mix, :rebar3], [], "hexpm", "5721c6b6d50122d8f68cccac712caa1231f97894bab779eff5ff0f886cb44648"}, - "ring_logger": {:hex, :ring_logger, "0.8.2", "78e0ffbf89b3f5b3c58f8660cb6b6fe2ca7ed5f56dc64e993119189d629c278c", [:mix], [{:circular_buffer, "~> 0.4.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}], "hexpm", "864c8982bfcdc17b7501d00cc2bcede6727ebf95cbeba30e70c795d03f9138c1"}, - "rollbax": {:hex, :rollbax, "0.11.0", "9557935d09d154c8775fa4efc709bfacbb73f20c58a3ced31dea2a74dd6e25de", [:mix], [{:hackney, "~> 1.1", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "a74318b175aae4bdddcc1ecfdf38755df3d8143c9902b1bfd19507ac9901062d"}, - "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm", "ba952bfa35b374e1e5d84bc5f5efe8360c6f99dc93b3118f714a9a2dff6c9e19"}, - "shoehorn": {:hex, :shoehorn, "0.7.0", "fc23870fb6b470f5c520fee692637b120a36e163842ab497bbec7e8a1aa6cfe3", [:mix], [], "hexpm", "eeb317ac677b228906039ccf532a582ad9f6d31d7958c98f5c853fe0459e0243"}, - "socket": {:hex, :socket, "0.3.13", "98a2ab20ce17f95fb512c5cadddba32b57273e0d2dba2d2e5f976c5969d0c632", [:mix], [], "hexpm", "f82ea9833ef49dde272e6568ab8aac657a636acb4cf44a7de8a935acb8957c2e"}, - "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm", "a588e8e4ab9570c32a03605fabff86f0fee1040530d33edc4fc4392db4d81700"}, - "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm", "0e1974b48684ba85255d2fe16c6106d52f5e759b260c95f676b23aa13b708a96"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "system_registry": {:hex, :system_registry, "0.8.2", "df791dc276652fcfb53be4dab823e05f8269b96ac57c26f86a67838dbc0eefe7", [:mix], [], "hexpm", "f7acdede22c73ab0b3735eead7f2095efb2a7a6198366564205274db2ca2a8f8"}, - "table_rex": {:hex, :table_rex, "2.0.0", "712783cbc2decb4d644d2ab8ad9315294f960c41b2cf0539308164922e352084", [:mix], [], "hexpm", "b183ff68abe9ace8764af4c2828767865d2c854d1d6f8cfd3660218166ed89a1"}, - "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, - "tesla": {:hex, :tesla, "1.4.3", "f5a494e08fb1abe4fd9c28abb17f3d9b62b8f6fc492860baa91efb1aab61c8a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e0755bb664bf4d664af72931f320c97adbf89da4586670f4864bf259b5750386"}, - "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, - "toolshed": {:hex, :toolshed, "0.2.24", "9df521cd565fd921dbfcd9668f4a1378efeb33a834743a287f4a7f9c9f01baa0", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: true]}], "hexpm", "c80de2c3a2ddeada0f709938607a1d3a136242168ea6638a12cf09445c8cf2f6"}, - "tortoise": {:hex, :tortoise, "0.10.0", "d8821b9a5052355ca61d9fa784652f435997fa98b210f88565c98f3494605efd", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "926d97b03cd0d2f6e0e1ebf06c1efa50101de96d0317dea5604c1c9e43e66735"}, - "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, - "uboot_env": {:hex, :uboot_env, "0.3.0", "8afbcc8e5b65e5d0d5660ded2f5835a959d2326fa8683183f380cd6464e75174", [:mix], [], "hexpm", "d8fe5d2b4d52a14398ace02bd604ff7a0fa8960550bb7254f75dcbd438ddc6a1"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, - "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, - "vintage_net": {:hex, :vintage_net, "0.11.1", "3bf5696c863c83dea7b6c245ca5b4cf4408961d06f6cbdeff271128c985db9f1", [:make, :mix], [{:beam_notify, "~> 0.2.0", [hex: :beam_notify, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0 or ~> 2.1.0 or ~> 3.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.1 or ~> 0.6.0", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "4d56f40a821098a4e734cf8e3de57ef7b4a04723ff105e3561a48baa9b2f138e"}, - "vintage_net_direct": {:hex, :vintage_net_direct, "0.9.0", "fbb61973dd0ea39029557a89be9dffca7801a0817dc4a181d129325a0fe6be93", [:mix], [{:one_dhcpd, "~> 0.2.3", [hex: :one_dhcpd, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.9.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "d00537f179f177b46ccde29f7461566c49c094fa02c19691b866afa643052b92"}, - "vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.10.3", "5325c590459544f871b0a807061fa37c3833ed8f83b94b0a15d497177503d5c2", [:mix], [{:vintage_net, "~> 0.10.0 or ~> 0.11.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "4ec1ae7b2188829e493f54e0ba9e36ea53e8c95aecdf5950011ce4f13fe4ed52"}, - "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.10.6", "f5509f7c455ee5f4bc52174ada4d8eaf6e6e597f9d5ba51f17ffed613c0e0a8a", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.10.0 or ~> 0.11.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "2d94acb727ba5982e1c17b50cb08594d644f8da7bd8f9a56c68d2de972319080"}, - "websocket_client": {:hex, :websocket_client, "1.3.0", "2275d7daaa1cdacebf2068891c9844b15f4fdc3de3ec2602420c2fb486db59b6", [:rebar3], [], "hexpm", "b864fa076f059b615da4ab99240e515b26132ce4d2d0f9df5d7f22f01fa04b65"}, - "x509": {:hex, :x509, "0.8.0", "b286b9dbb32801f76f48bdea476304d280c64ce172ea330c23d8df7ea9e75ce6", [:mix], [], "hexpm", "8aafaafdcafb1ea9f06bfc32c3b03ccc66f087e0faf36ef94c0195bb7a04157e"}, -} diff --git a/farmbot_os/priv/easter_eggs.json b/farmbot_os/priv/easter_eggs.json deleted file mode 100644 index cf8e9da49..000000000 --- a/farmbot_os/priv/easter_eggs.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "nouns" : [ - {"fav_song_link": "https://www.youtube.com/watch?v=d4nbfPZa9Ws"}, - {"fav_activity": "gardening"}, - {"fav_movie": "Star Wars"} - ], - "verbs" : [ - "is listening to :musical_score: <%= fav_song_link %>", - "is jamming out to <%= fav_song_link %> :musical_score:", - "is doing my favorite activity <%= fav_activity %>", - "is watching <%= fav_movie %> :film_projector:", - "wants to know when it should water it's plants? :sweat_drops: :sweat_drops:", - "is getting kind of bored... :clock830: :zzz:", - "is happy", - "is ecstatic", - "is lonely", - "is on strike", - "says hi", - "says hello", - "is growing vegetables for you", - "is watching for squirrels", - "sees plants in the clouds :cloud: :seedling:", - "is singing", - "wants a bath", - ":robot_face:", - ">:(", - "(>'-')>", - ":)", - "9____9", - "¯\\_(ツ)_/¯" - ] -} diff --git a/farmbot_os/test/easter_eggs_test.exs b/farmbot_os/test/easter_eggs_test.exs deleted file mode 100644 index 4aaf05464..000000000 --- a/farmbot_os/test/easter_eggs_test.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotOS.EasterEggsTest do - use ExUnit.Case - use Mimic - setup :verify_on_exit! - alias FarmbotOS.EasterEggs - - test "load_data/0" do - %{"verbs" => verbs} = EasterEggs.load_data() - idk = "¯\\_(ツ)_/¯" - assert Enum.member?(verbs, idk) - end -end diff --git a/farmbot_os/test/test_helper.exs b/farmbot_os/test/test_helper.exs deleted file mode 100644 index 525adf36c..000000000 --- a/farmbot_os/test/test_helper.exs +++ /dev/null @@ -1,40 +0,0 @@ -Application.ensure_all_started(:mimic) - -[ - FarmbotCore.Celery.SpecialValue, - FarmbotCore.Celery.SysCalls, - FarmbotCore.Asset, - FarmbotCore.Asset.Device, - FarmbotCore.Asset.FbosConfig, - FarmbotCore.Asset.FirmwareConfig, - FarmbotCore.Asset.Private, - FarmbotCore.BotState, - FarmbotCore.Config, - FarmbotCore.FarmwareRuntime, - FarmbotCore.Firmware.Command, - FarmbotCore.Leds, - FarmbotCore.LogExecutor, - FarmbotExt.API, - FarmbotExt.API.Reconciler, - FarmbotExt.Bootstrap.Authorization, - FarmbotTelemetry.HTTP, - FarmbotOS.Configurator.ConfigDataLayer, - FarmbotOS.Configurator.DetsTelemetryLayer, - FarmbotOS.Configurator.FakeNetworkLayer, - FarmbotOS.Lua.DataManipulation, - FarmbotOS.Lua.Firmware, - FarmbotOS.Lua.Info, - FarmbotOS.SysCalls, - FarmbotOS.SysCalls.ChangeOwnership.Support, - FarmbotOS.SysCalls.Farmware, - FarmbotOS.SysCalls.Movement, - FarmbotOS.SysCalls.ResourceUpdate, - FarmbotOS.UpdateSupport, - File, - MuonTrap, - System -] -|> Enum.map(&Mimic.copy/1) - -ExUnit.configure(max_cases: 1) -ExUnit.start() diff --git a/farmbot_telemetry/.formatter.exs b/farmbot_telemetry/.formatter.exs deleted file mode 100644 index 069e8b1d4..000000000 --- a/farmbot_telemetry/.formatter.exs +++ /dev/null @@ -1,5 +0,0 @@ -# Used by "mix format" -[ - line_length: 80, - inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] -] diff --git a/farmbot_telemetry/.gitignore b/farmbot_telemetry/.gitignore deleted file mode 100644 index 490ea8200..000000000 --- a/farmbot_telemetry/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# The directory Mix will write compiled artifacts to. -/_build/ - -# If you run "mix test --cover", coverage assets end up here. -/cover/ - -# The directory Mix downloads your dependencies sources to. -/deps/ - -# Where third-party dependencies like ExDoc output generated docs. -/doc/ - -# Ignore .fetch files in case you like to edit your project deps locally. -/.fetch - -# If the VM crashes, it generates a dump, let's ignore it too. -erl_crash.dump - -# Also ignore archive artifacts (built via "mix archive.build"). -*.ez - -# Ignore package tarball (built via "mix hex.build"). -farmbot_telemetry-*.tar - diff --git a/farmbot_telemetry/README.md b/farmbot_telemetry/README.md deleted file mode 100644 index 71138b79e..000000000 --- a/farmbot_telemetry/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# FarmbotTelemetry - -**TODO: Add description** - -## Installation - -If [available in Hex](https://hex.pm/docs/publish), the package can be installed -by adding `farmbot_telemetry` to your list of dependencies in `mix.exs`: - -```elixir -def deps do - [ - {:farmbot_telemetry, "~> 0.1.0"} - ] -end -``` - -Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) -and published on [HexDocs](https://hexdocs.pm). Once published, the docs can -be found at [https://hexdocs.pm/farmbot_telemetry](https://hexdocs.pm/farmbot_telemetry). - diff --git a/farmbot_telemetry/coveralls.json b/farmbot_telemetry/coveralls.json deleted file mode 100644 index 1a39e2ed2..000000000 --- a/farmbot_telemetry/coveralls.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "coverage_options": { - "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 56 - } -} diff --git a/farmbot_telemetry/mix.exs b/farmbot_telemetry/mix.exs deleted file mode 100644 index 4a06eb836..000000000 --- a/farmbot_telemetry/mix.exs +++ /dev/null @@ -1,63 +0,0 @@ -defmodule FarmbotTelemetry.MixProject do - use Mix.Project - - @version Path.join([__DIR__, "..", "VERSION"]) - |> File.read!() - |> String.trim() - @elixir_version Path.join([__DIR__, "..", "ELIXIR_VERSION"]) - |> File.read!() - |> String.trim() - - def project do - [ - app: :farmbot_telemetry, - version: @version, - elixir: @elixir_version, - elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], - version: "0.1.0", - elixir: "~> 1.12.2", - start_permanent: Mix.env() == :prod, - deps: deps(), - test_coverage: [tool: ExCoveralls], - preferred_cli_env: [ - test: :test, - coveralls: :test, - "coveralls.circle": :test, - "coveralls.detail": :test, - "coveralls.post": :test, - "coveralls.html": :test - ], - source_url: "https://github.com/Farmbot/farmbot_os", - homepage_url: "http://farmbot.io", - docs: [ - logo: "../farmbot_os/priv/static/farmbot_logo.png", - extras: Path.wildcard("../docs/**/*.md") - ] - ] - end - - # Run "mix help compile.app" to learn about applications. - def application do - [ - extra_applications: [ - :certifi, - :crypto, - :inets, - :logger, - :public_key - ], - mod: {FarmbotTelemetry.Application, []} - ] - end - - # Run "mix help deps" to learn about dependencies. - defp deps do - [ - {:certifi, "~> 2.8"}, - {:telemetry, "~> 1.0.0"}, - {:uuid, "~> 1.1.8"}, - {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, - {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false} - ] - end -end diff --git a/farmbot_telemetry/mix.lock b/farmbot_telemetry/mix.lock deleted file mode 100644 index f939c3d06..000000000 --- a/farmbot_telemetry/mix.lock +++ /dev/null @@ -1,23 +0,0 @@ -%{ - "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, - "dialyxir": {:hex, :dialyxir, "1.0.0-rc.7", "6287f8f2cb45df8584317a4be1075b8c9b8a69de8eeb82b4d9e6c761cf2664cd", [:mix], [{:erlex, ">= 0.2.5", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "506294d6c543e4e5282d4852aead19ace8a35bedeb043f9256a06a6336827122"}, - "earmark": {:hex, :earmark, "1.4.2", "3aa0bd23bc4c61cf2f1e5d752d1bb470560a6f8539974f767a38923bb20e1d7f", [:mix], [], "hexpm", "5e8806285d8a3a8999bd38e4a73c58d28534c856bc38c44818e5ba85bbda16fb"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, - "erlex": {:hex, :erlex, "0.2.5", "e51132f2f472e13d606d808f0574508eeea2030d487fc002b46ad97e738b0510", [:mix], [], "hexpm", "756d3e19b056339af674b715fdd752c5dac468cf9d0e2d1a03abf4574e99fbf8"}, - "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, - "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, - "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, - "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, - "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, - "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, - "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, - "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, - "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, - "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, - "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, - "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, -} diff --git a/farmbot_telemetry/test/test_helper.exs b/farmbot_telemetry/test/test_helper.exs deleted file mode 100644 index 302fbc977..000000000 --- a/farmbot_telemetry/test/test_helper.exs +++ /dev/null @@ -1,2 +0,0 @@ -ExUnit.configure(max_cases: 1) -ExUnit.start() diff --git a/farmbot_core/fixture/corpus.json b/fixtures/corpus.json similarity index 100% rename from farmbot_core/fixture/corpus.json rename to fixtures/corpus.json diff --git a/farmbot_core/fixture/every_sequence.json b/fixtures/every_sequence.json similarity index 100% rename from farmbot_core/fixture/every_sequence.json rename to fixtures/every_sequence.json diff --git a/farmbot_core/fixtures/farmware/test-farmware/manifest.json b/fixtures/farmware/test-farmware/manifest.json similarity index 100% rename from farmbot_core/fixtures/farmware/test-farmware/manifest.json rename to fixtures/farmware/test-farmware/manifest.json diff --git a/farmbot_core/fixture/inner_sequence.json b/fixtures/inner_sequence.json similarity index 100% rename from farmbot_core/fixture/inner_sequence.json rename to fixtures/inner_sequence.json diff --git a/farmbot_core/fixture/outer_sequence.json b/fixtures/outer_sequence.json similarity index 100% rename from farmbot_core/fixture/outer_sequence.json rename to fixtures/outer_sequence.json diff --git a/farmbot_core/fixture/paramater_sequence.json b/fixtures/paramater_sequence.json similarity index 100% rename from farmbot_core/fixture/paramater_sequence.json rename to fixtures/paramater_sequence.json diff --git a/farmbot_core/fixture/point_group_sequence.json b/fixtures/point_group_sequence.json similarity index 100% rename from farmbot_core/fixture/point_group_sequence.json rename to fixtures/point_group_sequence.json diff --git a/farmbot_core/fixtures/regimens/regimen_with_variables.json b/fixtures/regimens/regimen_with_variables.json similarity index 100% rename from farmbot_core/fixtures/regimens/regimen_with_variables.json rename to fixtures/regimens/regimen_with_variables.json diff --git a/farmbot_core/fixture/sequence_pair.json b/fixtures/sequence_pair.json similarity index 100% rename from farmbot_core/fixture/sequence_pair.json rename to fixtures/sequence_pair.json diff --git a/farmbot_core/fixture/unbound.json b/fixtures/unbound.json similarity index 100% rename from farmbot_core/fixture/unbound.json rename to fixtures/unbound.json diff --git a/farmbot_core/fixture/unbound_var_x.json b/fixtures/unbound_var_x.json similarity index 100% rename from farmbot_core/fixture/unbound_var_x.json rename to fixtures/unbound_var_x.json diff --git a/farmbot_os/lib/avrdude.ex b/lib/avrdude.ex similarity index 100% rename from farmbot_os/lib/avrdude.ex rename to lib/avrdude.ex diff --git a/farmbot_core/lib/celery.ex b/lib/celery.ex similarity index 75% rename from farmbot_core/lib/celery.ex rename to lib/celery.ex index 054279a34..9e3221494 100644 --- a/farmbot_core/lib/celery.ex +++ b/lib/celery.ex @@ -11,10 +11,11 @@ defmodule FarmbotCore.Celery do Scheduler.schedule(ast, at, data) end - @entrypoints [ :execute, :sequence, :rpc_request ] + @entrypoints [:execute, :sequence, :rpc_request] @doc "Execute an AST in place" - def execute(%AST{kind: k} = ast, tag, caller \\ self()) when k in @entrypoints do + def execute(%AST{kind: k} = ast, tag, caller \\ self()) + when k in @entrypoints do StepRunner.begin(caller, tag, ast) end end diff --git a/farmbot_core/lib/celery/ast.ex b/lib/celery/ast.ex similarity index 100% rename from farmbot_core/lib/celery/ast.ex rename to lib/celery/ast.ex diff --git a/farmbot_core/lib/celery/ast/factory.ex b/lib/celery/ast/factory.ex similarity index 100% rename from farmbot_core/lib/celery/ast/factory.ex rename to lib/celery/ast/factory.ex diff --git a/farmbot_core/lib/celery/compiler.ex b/lib/celery/compiler.ex similarity index 87% rename from farmbot_core/lib/celery/compiler.ex rename to lib/celery/compiler.ex index c0c76f641..a72ecb1e3 100644 --- a/farmbot_core/lib/celery/compiler.ex +++ b/lib/celery/compiler.ex @@ -83,6 +83,7 @@ defmodule FarmbotCore.Celery.Compiler do defdelegate unquote(:_if)(ast, cs_scope), to: Compiler.If defdelegate update_farmware(ast, cs_scope), to: Compiler.Farmware defdelegate update_resource(ast, cs_scope), to: Compiler.UpdateResource + # defdelegate variable_declaration(ast, cs_scope), to: Compiler.VariableDeclaration defdelegate write_pin(ast, cs_scope), to: Compiler.PinControl defdelegate zero(ast, cs_scope), to: Compiler.AxisControl @@ -100,7 +101,7 @@ defmodule FarmbotCore.Celery.Compiler do def nothing(_ast, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.nothing() + FarmbotCore.Celery.SysCallGlue.nothing() end end @@ -112,9 +113,10 @@ defmodule FarmbotCore.Celery.Compiler do def wait(%{args: %{milliseconds: millis}}, cs_scope) do quote location: :keep do - with millis when is_integer(millis) <- unquote(celery_to_elixir(millis, cs_scope)) do - FarmbotCore.Celery.SysCalls.log("Waiting for #{millis} milliseconds") - FarmbotCore.Celery.SysCalls.wait(millis) + with millis when is_integer(millis) <- + unquote(celery_to_elixir(millis, cs_scope)) do + FarmbotCore.Celery.SysCallGlue.log("Waiting for #{millis} milliseconds") + FarmbotCore.Celery.SysCallGlue.wait(millis) else {:error, reason} -> {:error, reason} @@ -138,7 +140,7 @@ defmodule FarmbotCore.Celery.Compiler do end) quote location: :keep do - FarmbotCore.Celery.SysCalls.send_message( + FarmbotCore.Celery.SysCallGlue.send_message( unquote(celery_to_elixir(type, cs_scope)), unquote(celery_to_elixir(msg, cs_scope)), unquote(channels) @@ -148,44 +150,46 @@ defmodule FarmbotCore.Celery.Compiler do def identifier(%{args: %{label: var_name}}, _cs_scope) do quote location: :keep do - {:ok, var} = FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, unquote(var_name)) + {:ok, var} = + FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, unquote(var_name)) + var end end def emergency_lock(_, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.emergency_lock() + FarmbotCore.Celery.SysCallGlue.emergency_lock() end end def emergency_unlock(_, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.emergency_unlock() + FarmbotCore.Celery.SysCallGlue.emergency_unlock() end end def read_status(_, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.read_status() + FarmbotCore.Celery.SysCallGlue.read_status() end end def sync(_, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.sync() + FarmbotCore.Celery.SysCallGlue.sync() end end def check_updates(_, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.check_update() + FarmbotCore.Celery.SysCallGlue.check_update() end end def flash_firmware(%{args: %{package: package_name}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.flash_firmware( + FarmbotCore.Celery.SysCallGlue.flash_firmware( unquote(celery_to_elixir(package_name, cs_scope)) ) end @@ -193,25 +197,25 @@ defmodule FarmbotCore.Celery.Compiler do def power_off(_, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.power_off() + FarmbotCore.Celery.SysCallGlue.power_off() end end def reboot(%{args: %{package: "farmbot_os"}}, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.reboot() + FarmbotCore.Celery.SysCallGlue.reboot() end end def reboot(%{args: %{package: "arduino_firmware"}}, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.firmware_reboot() + FarmbotCore.Celery.SysCallGlue.firmware_reboot() end end def factory_reset(%{args: %{package: package}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.factory_reset( + FarmbotCore.Celery.SysCallGlue.factory_reset( unquote(celery_to_elixir(package, cs_scope)) ) end @@ -232,7 +236,7 @@ defmodule FarmbotCore.Celery.Compiler do server = Map.get(pairs, "server") quote location: :keep do - FarmbotCore.Celery.SysCalls.change_ownership( + FarmbotCore.Celery.SysCallGlue.change_ownership( unquote(celery_to_elixir(email, cs_scope)), unquote(celery_to_elixir(secret, cs_scope)), unquote(celery_to_elixir(server, cs_scope)) diff --git a/farmbot_core/lib/celery/compiler/utils.ex b/lib/celery/compiler/utils.ex similarity index 63% rename from farmbot_core/lib/celery/compiler/utils.ex rename to lib/celery/compiler/utils.ex index 4809752da..3c191513e 100644 --- a/farmbot_core/lib/celery/compiler/utils.ex +++ b/lib/celery/compiler/utils.ex @@ -4,6 +4,7 @@ defmodule FarmbotCore.Celery.Compiler.Utils do AST, Compiler.Scope } + @doc """ Recursively compiles a list or single Celery AST into an Elixir `__block__` """ @@ -20,8 +21,11 @@ defmodule FarmbotCore.Celery.Compiler.Utils do def compile_block([ast | rest], cs_scope, acc) do case Compiler.compile(ast, cs_scope) do - {_, _, _} = compiled -> compile_block(rest, cs_scope, acc ++ [compiled]) - compiled when is_list(compiled) -> compile_block(rest, cs_scope, acc ++ compiled) + {_, _, _} = compiled -> + compile_block(rest, cs_scope, acc ++ [compiled]) + + compiled when is_list(compiled) -> + compile_block(rest, cs_scope, acc ++ compiled) end end @@ -36,33 +40,35 @@ defmodule FarmbotCore.Celery.Compiler.Utils do end def add_init_logs(steps, scope, sequence_name) do - message = if Scope.has_key?(scope, "__GROUP__") do - {:ok, meta} = Scope.fetch!(scope, "__GROUP__") - "[#{meta.current_index}/#{meta.size}] Starting #{sequence_name}" - else - "Starting #{sequence_name}" - end + message = + if Scope.has_key?(scope, "__GROUP__") do + {:ok, meta} = Scope.fetch!(scope, "__GROUP__") + "[#{meta.current_index}/#{meta.size}] Starting #{sequence_name}" + else + "Starting #{sequence_name}" + end front = [ quote do fn -> - FarmbotCore.Celery - .SysCalls - .sequence_init_log(unquote(message)) - :ok - end + FarmbotCore.Celery.SysCallGlue.sequence_init_log(unquote(message)) + :ok + end end ] + back = [ quote do fn -> - FarmbotCore.Celery - .SysCalls - .sequence_complete_log("Completed #{unquote(sequence_name)}") + FarmbotCore.Celery.SysCallGlue.sequence_complete_log( + "Completed #{unquote(sequence_name)}" + ) + :ok end end ] + front ++ steps ++ back end end diff --git a/farmbot_core/lib/celery/compilers/assertion_compiler.ex b/lib/celery/compilers/assertion_compiler.ex similarity index 85% rename from farmbot_core/lib/celery/compilers/assertion_compiler.ex rename to lib/celery/compilers/assertion_compiler.ex index 91fa01f8e..66fa16ac1 100644 --- a/farmbot_core/lib/celery/compilers/assertion_compiler.ex +++ b/lib/celery/compilers/assertion_compiler.ex @@ -9,13 +9,16 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do _then: then_ast }, comment: comment - }, cs_scope) do + }, + cs_scope + ) do comment_header = if comment do "[#{comment}] " else "[Assertion] " end + lua_code = Compiler.celery_to_elixir(expression, cs_scope) result = FarmbotCore.Celery.Compiler.Lua.do_lua(lua_code, cs_scope) @@ -24,9 +27,10 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do assertion_type = unquote(assertion_type) cs_scope = unquote(cs_scope) result = unquote(result) + case result do {:error, reason} -> - FarmbotCore.Celery.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed to evaluate, aborting" @@ -35,7 +39,7 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do {:error, reason} {:ok, [true]} -> - FarmbotCore.Celery.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( true, assertion_type, "#{comment_header}passed, continuing execution" @@ -44,7 +48,7 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do :ok {:ok, _} when assertion_type == "continue" -> - FarmbotCore.Celery.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, continuing execution" @@ -53,7 +57,7 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do :ok {:ok, _} when assertion_type == "abort" -> - FarmbotCore.Celery.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, aborting" @@ -62,7 +66,7 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do {:error, "Assertion failed (aborting)"} {:ok, _} when assertion_type == "recover" -> - FarmbotCore.Celery.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, recovering and continuing" @@ -71,7 +75,7 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do unquote(Compiler.Utils.compile_block(then_ast, cs_scope)) {:ok, _} when assertion_type == "abort_recover" -> - FarmbotCore.Celery.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, recovering and aborting" @@ -79,6 +83,7 @@ defmodule FarmbotCore.Celery.Compiler.Assertion do then_block = unquote(Compiler.Utils.compile_block(then_ast, cs_scope)) abort = %FarmbotCore.Celery.AST{kind: :abort, args: %{}} + then_block ++ [ FarmbotCore.Celery.Compiler.compile(abort, cs_scope) diff --git a/farmbot_core/lib/celery/compilers/axis_control_compiler.ex b/lib/celery/compilers/axis_control_compiler.ex similarity index 54% rename from farmbot_core/lib/celery/compilers/axis_control_compiler.ex rename to lib/celery/compilers/axis_control_compiler.ex index 1e283a896..9958b64b9 100644 --- a/farmbot_core/lib/celery/compilers/axis_control_compiler.ex +++ b/lib/celery/compilers/axis_control_compiler.ex @@ -2,49 +2,55 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do alias FarmbotCore.Celery.Compiler # Compiles move_absolute - def move_absolute(%{args: %{location: location,offset: offset,speed: speed}}, cs_scope) do - [locx , locy , locz] = cs_to_xyz(location, cs_scope) + def move_absolute( + %{args: %{location: location, offset: offset, speed: speed}}, + cs_scope + ) do + [locx, locy, locz] = cs_to_xyz(location, cs_scope) [offx, offy, offz] = cs_to_xyz(offset, cs_scope) quote location: :keep do - # Subtract the location from offset. - # Note: list syntax here for readability. - [x, y, z] = [ - unquote(locx) + unquote(offx), - unquote(locy) + unquote(offy), - unquote(locz) + unquote(offz) - ] - - x_str = FarmbotCore.Celery.FormatUtil.format_float(x) - y_str = FarmbotCore.Celery.FormatUtil.format_float(y) - z_str = FarmbotCore.Celery.FormatUtil.format_float(z) - - FarmbotCore.Celery.SysCalls.log( - "Moving to (#{x_str}, #{y_str}, #{z_str})", - true - ) - - FarmbotCore.Celery.SysCalls.move_absolute( - x, - y, - z, - unquote(Compiler.celery_to_elixir(speed, cs_scope)) - ) + # Subtract the location from offset. + # Note: list syntax here for readability. + [x, y, z] = [ + unquote(locx) + unquote(offx), + unquote(locy) + unquote(offy), + unquote(locz) + unquote(offz) + ] + + x_str = FarmbotCore.Celery.FormatUtil.format_float(x) + y_str = FarmbotCore.Celery.FormatUtil.format_float(y) + z_str = FarmbotCore.Celery.FormatUtil.format_float(z) + + FarmbotCore.Celery.SysCallGlue.log( + "Moving to (#{x_str}, #{y_str}, #{z_str})", + true + ) + + FarmbotCore.Celery.SysCallGlue.move_absolute( + x, + y, + z, + unquote(Compiler.celery_to_elixir(speed, cs_scope)) + ) end end # compiles move_relative into move absolute def move_relative(%{args: %{x: x, y: y, z: z, speed: speed}}, cs_scope) do quote location: :keep do - with locx when is_number(locx) <- unquote(Compiler.celery_to_elixir(x, cs_scope)), - locy when is_number(locy) <- unquote(Compiler.celery_to_elixir(y, cs_scope)), - locz when is_number(locz) <- unquote(Compiler.celery_to_elixir(z, cs_scope)), + with locx when is_number(locx) <- + unquote(Compiler.celery_to_elixir(x, cs_scope)), + locy when is_number(locy) <- + unquote(Compiler.celery_to_elixir(y, cs_scope)), + locz when is_number(locz) <- + unquote(Compiler.celery_to_elixir(z, cs_scope)), curx when is_number(curx) <- - FarmbotCore.Celery.SysCalls.get_current_x(), + FarmbotCore.Celery.SysCallGlue.get_current_x(), cury when is_number(cury) <- - FarmbotCore.Celery.SysCalls.get_current_y(), + FarmbotCore.Celery.SysCallGlue.get_current_y(), curz when is_number(curz) <- - FarmbotCore.Celery.SysCalls.get_current_z() do + FarmbotCore.Celery.SysCallGlue.get_current_z() do # Combine them x = locx + curx y = locy + cury @@ -53,12 +59,12 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do y_str = FarmbotCore.Celery.FormatUtil.format_float(y) z_str = FarmbotCore.Celery.FormatUtil.format_float(z) - FarmbotCore.Celery.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.log( "Moving relative to (#{x_str}, #{y_str}, #{z_str})", true ) - FarmbotCore.Celery.SysCalls.move_absolute( + FarmbotCore.Celery.SysCallGlue.move_absolute( x, y, z, @@ -71,11 +77,11 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do # Expands find_home(all) into three find_home/1 calls def find_home(%{args: %{axis: "all"}}, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.log("Finding home on all axes", true) + FarmbotCore.Celery.SysCallGlue.log("Finding home on all axes", true) - with :ok <- FarmbotCore.Celery.SysCalls.find_home("z"), - :ok <- FarmbotCore.Celery.SysCalls.find_home("y") do - FarmbotCore.Celery.SysCalls.find_home("x") + with :ok <- FarmbotCore.Celery.SysCallGlue.find_home("z"), + :ok <- FarmbotCore.Celery.SysCallGlue.find_home("y") do + FarmbotCore.Celery.SysCallGlue.find_home("x") end end end @@ -85,12 +91,12 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do quote location: :keep do with axis when axis in ["x", "y", "z"] <- unquote(Compiler.celery_to_elixir(axis, cs_scope)) do - FarmbotCore.Celery.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.log( "Finding home on the #{String.upcase(axis)} axis", true ) - FarmbotCore.Celery.SysCalls.find_home(axis) + FarmbotCore.Celery.SysCallGlue.find_home(axis) else {:error, reason} -> {:error, reason} @@ -101,13 +107,13 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do # Expands home(all) into three home/1 calls def home(%{args: %{axis: "all", speed: speed}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.log("Going to home on all axes", true) + FarmbotCore.Celery.SysCallGlue.log("Going to home on all axes", true) with speed when is_number(speed) <- unquote(Compiler.celery_to_elixir(speed, cs_scope)), - :ok <- FarmbotCore.Celery.SysCalls.home("z", speed), - :ok <- FarmbotCore.Celery.SysCalls.home("y", speed) do - FarmbotCore.Celery.SysCalls.home("x", speed) + :ok <- FarmbotCore.Celery.SysCallGlue.home("z", speed), + :ok <- FarmbotCore.Celery.SysCallGlue.home("y", speed) do + FarmbotCore.Celery.SysCallGlue.home("x", speed) end end end @@ -119,12 +125,12 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do unquote(Compiler.celery_to_elixir(axis, cs_scope)), speed when is_number(speed) <- unquote(Compiler.celery_to_elixir(speed, cs_scope)) do - FarmbotCore.Celery.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.log( "Going to home on the #{String.upcase(axis)} axis", true ) - FarmbotCore.Celery.SysCalls.home(axis, speed) + FarmbotCore.Celery.SysCallGlue.home(axis, speed) else {:error, reason} -> {:error, reason} @@ -135,11 +141,11 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do # Expands zero(all) into three zero/1 calls def zero(%{args: %{axis: "all"}}, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.log("Setting home for all axes", true) + FarmbotCore.Celery.SysCallGlue.log("Setting home for all axes", true) - with :ok <- FarmbotCore.Celery.SysCalls.zero("z"), - :ok <- FarmbotCore.Celery.SysCalls.zero("y") do - FarmbotCore.Celery.SysCalls.zero("x") + with :ok <- FarmbotCore.Celery.SysCallGlue.zero("z"), + :ok <- FarmbotCore.Celery.SysCallGlue.zero("y") do + FarmbotCore.Celery.SysCallGlue.zero("x") end end end @@ -149,12 +155,12 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do quote location: :keep do with axis when axis in ["x", "y", "z"] <- unquote(Compiler.celery_to_elixir(axis, cs_scope)) do - FarmbotCore.Celery.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.log( "Setting home for the #{String.upcase(axis)} axis", true ) - FarmbotCore.Celery.SysCalls.zero(axis) + FarmbotCore.Celery.SysCallGlue.zero(axis) else {:error, reason} -> {:error, reason} @@ -165,11 +171,11 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do # Expands calibrate(all) into three calibrate/1 calls def calibrate(%{args: %{axis: "all"}}, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.log("Finding length of all axes", true) + FarmbotCore.Celery.SysCallGlue.log("Finding length of all axes", true) - with :ok <- FarmbotCore.Celery.SysCalls.calibrate("z"), - :ok <- FarmbotCore.Celery.SysCalls.calibrate("y") do - FarmbotCore.Celery.SysCalls.calibrate("x") + with :ok <- FarmbotCore.Celery.SysCallGlue.calibrate("z"), + :ok <- FarmbotCore.Celery.SysCallGlue.calibrate("y") do + FarmbotCore.Celery.SysCallGlue.calibrate("x") else {:error, reason} -> {:error, reason} end @@ -182,8 +188,8 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do with axis when axis in ["x", "y", "z"] <- unquote(Compiler.celery_to_elixir(axis, cs_scope)) do msg = "Determining length of the #{String.upcase(axis)} axis" - FarmbotCore.Celery.SysCalls.log(msg, true) - FarmbotCore.Celery.SysCalls.calibrate(axis) + FarmbotCore.Celery.SysCallGlue.log(msg, true) + FarmbotCore.Celery.SysCallGlue.calibrate(axis) else {:error, reason} -> {:error, reason} end @@ -196,7 +202,7 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do # Prevent circular refernces. # I doubt end users would intentionally do this, so treat # it like an error. - if variable.kind == :identifier, do: raise "Refusing to perform recursion" + if variable.kind == :identifier, do: raise("Refusing to perform recursion") cs_to_xyz(variable, cs_scope) end @@ -205,16 +211,17 @@ defmodule FarmbotCore.Celery.Compiler.AxisControl do end defp cs_to_xyz(%{kind: :tool, args: args}, _) do - slot = FarmbotCore.Celery.SysCalls.get_toolslot_for_tool(args.tool_id) + slot = FarmbotCore.Celery.SysCallGlue.get_toolslot_for_tool(args.tool_id) vec_map_to_array(slot) end defp cs_to_xyz(%{kind: :point} = ast, _) do - %{ pointer_type: t, pointer_id: id } = ast.args - vec_map_to_array(FarmbotCore.Celery.SysCalls.point(t, id)) + %{pointer_type: t, pointer_id: id} = ast.args + vec_map_to_array(FarmbotCore.Celery.SysCallGlue.point(t, id)) end - defp cs_to_xyz(other, _), do: raise "Unexpected location or offset: #{inspect(other)}" + defp cs_to_xyz(other, _), + do: raise("Unexpected location or offset: #{inspect(other)}") - defp vec_map_to_array(xyz), do: [ xyz.x, xyz.y, xyz.z ] + defp vec_map_to_array(xyz), do: [xyz.x, xyz.y, xyz.z] end diff --git a/farmbot_core/lib/celery/compilers/data_control_compiler.ex b/lib/celery/compilers/data_control_compiler.ex similarity index 84% rename from farmbot_core/lib/celery/compilers/data_control_compiler.ex rename to lib/celery/compilers/data_control_compiler.ex index e6caa63c2..0f15081ee 100644 --- a/farmbot_core/lib/celery/compilers/data_control_compiler.ex +++ b/lib/celery/compilers/data_control_compiler.ex @@ -5,7 +5,7 @@ defmodule FarmbotCore.Celery.Compiler.DataControl do # Coordinate should return a vec3 def coordinate(%{args: %{x: x, y: y, z: z}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.coordinate( + FarmbotCore.Celery.SysCallGlue.coordinate( unquote(Compiler.celery_to_elixir(x, cs_scope)), unquote(Compiler.celery_to_elixir(y, cs_scope)), unquote(Compiler.celery_to_elixir(z, cs_scope)) @@ -16,7 +16,7 @@ defmodule FarmbotCore.Celery.Compiler.DataControl do # compiles point def point(%{args: %{pointer_type: type, pointer_id: id}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.point( + FarmbotCore.Celery.SysCallGlue.point( unquote(Compiler.celery_to_elixir(type, cs_scope)), unquote(Compiler.celery_to_elixir(id, cs_scope)) ) @@ -26,7 +26,7 @@ defmodule FarmbotCore.Celery.Compiler.DataControl do # compile a named pin def named_pin(%{args: %{pin_id: id, pin_type: type}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.named_pin( + FarmbotCore.Celery.SysCallGlue.named_pin( unquote(Compiler.celery_to_elixir(type, cs_scope)), unquote(Compiler.celery_to_elixir(id, cs_scope)) ) @@ -35,7 +35,7 @@ defmodule FarmbotCore.Celery.Compiler.DataControl do def tool(%{args: %{tool_id: tool_id}}, cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.get_toolslot_for_tool( + FarmbotCore.Celery.SysCallGlue.get_toolslot_for_tool( unquote(Compiler.celery_to_elixir(tool_id, cs_scope)) ) end diff --git a/farmbot_core/lib/celery/compilers/execute_compiler.ex b/lib/celery/compilers/execute_compiler.ex similarity index 92% rename from farmbot_core/lib/celery/compilers/execute_compiler.ex rename to lib/celery/compilers/execute_compiler.ex index 8727211fa..44046683e 100644 --- a/farmbot_core/lib/celery/compilers/execute_compiler.ex +++ b/lib/celery/compilers/execute_compiler.ex @@ -14,7 +14,8 @@ defmodule FarmbotCore.Celery.Compiler.Execute do defp do_execute(execute_ast, previous_scope) do id = execute_ast.args.sequence_id - case FarmbotCore.Celery.SysCalls.get_sequence(id) do + + case FarmbotCore.Celery.SysCallGlue.get_sequence(id) do %AST{kind: :sequence} = sequence_ast -> quote location: :keep do # execute_compiler.ex @@ -22,6 +23,7 @@ defmodule FarmbotCore.Celery.Compiler.Execute do cs_scope = unquote(Scope.new(previous_scope, execute_ast.body)) FarmbotCore.Celery.Compiler.Sequence.sequence(sequence, cs_scope) end + error -> error end diff --git a/farmbot_core/lib/celery/compilers/farmware_compiler.ex b/lib/celery/compilers/farmware_compiler.ex similarity index 76% rename from farmbot_core/lib/celery/compilers/farmware_compiler.ex rename to lib/celery/compilers/farmware_compiler.ex index 2e3ea8bef..77acdb977 100644 --- a/farmbot_core/lib/celery/compilers/farmware_compiler.ex +++ b/lib/celery/compilers/farmware_compiler.ex @@ -14,15 +14,15 @@ defmodule FarmbotCore.Celery.Compiler.Farmware do quote location: :keep do package = unquote(Compiler.celery_to_elixir(package, cs_scope)) env = unquote(Macro.escape(Map.new(env))) - FarmbotCore.Celery.SysCalls.log(unquote(format_log(package)), true) - FarmbotCore.Celery.SysCalls.execute_script(package, env) + FarmbotCore.Celery.SysCallGlue.log(unquote(format_log(package)), true) + FarmbotCore.Celery.SysCallGlue.execute_script(package, env) end end def install_first_party_farmware(_, _) do quote location: :keep do - FarmbotCore.Celery.SysCalls.log("Installing dependencies...") - FarmbotCore.Celery.SysCalls.install_first_party_farmware() + FarmbotCore.Celery.SysCallGlue.log("Installing dependencies...") + FarmbotCore.Celery.SysCallGlue.install_first_party_farmware() end end @@ -30,7 +30,7 @@ defmodule FarmbotCore.Celery.Compiler.Farmware do kvs = Enum.map(pairs, fn %{kind: :pair, args: %{label: key, value: value}} -> quote location: :keep do - FarmbotCore.Celery.SysCalls.set_user_env( + FarmbotCore.Celery.SysCallGlue.set_user_env( unquote(key), unquote(value) ) @@ -45,8 +45,8 @@ defmodule FarmbotCore.Celery.Compiler.Farmware do def update_farmware(%{args: %{package: package}}, cs_scope) do quote location: :keep do package = unquote(Compiler.celery_to_elixir(package, cs_scope)) - FarmbotCore.Celery.SysCalls.log("Updating Farmware: #{package}", true) - FarmbotCore.Celery.SysCalls.update_farmware(package) + FarmbotCore.Celery.SysCallGlue.log("Updating Farmware: #{package}", true) + FarmbotCore.Celery.SysCallGlue.update_farmware(package) end end diff --git a/farmbot_core/lib/celery/compilers/if_compiler.ex b/lib/celery/compilers/if_compiler.ex similarity index 83% rename from farmbot_core/lib/celery/compilers/if_compiler.ex rename to lib/celery/compilers/if_compiler.ex index 5f1004e5c..88ff16b2a 100644 --- a/farmbot_core/lib/celery/compilers/if_compiler.ex +++ b/lib/celery/compilers/if_compiler.ex @@ -11,7 +11,9 @@ defmodule FarmbotCore.Celery.Compiler.If do op: op, rhs: rhs } - }, cs_scope) do + }, + cs_scope + ) do rhs = Compiler.celery_to_elixir(rhs, cs_scope) # Turns the left hand side arg into @@ -23,20 +25,20 @@ defmodule FarmbotCore.Celery.Compiler.If do case lhs_ast do "x" -> quote [location: :keep], - do: FarmbotCore.Celery.SysCalls.get_cached_x() + do: FarmbotCore.Celery.SysCallGlue.get_cached_x() "y" -> quote [location: :keep], - do: FarmbotCore.Celery.SysCalls.get_cached_y() + do: FarmbotCore.Celery.SysCallGlue.get_cached_y() "z" -> quote [location: :keep], - do: FarmbotCore.Celery.SysCalls.get_cached_z() + do: FarmbotCore.Celery.SysCallGlue.get_cached_z() "pin" <> pin -> quote [location: :keep], do: - FarmbotCore.Celery.SysCalls.read_cached_pin( + FarmbotCore.Celery.SysCallGlue.read_cached_pin( unquote(String.to_integer(pin)) ) @@ -45,7 +47,7 @@ defmodule FarmbotCore.Celery.Compiler.If do %AST{kind: :named_pin} = ast -> quote [location: :keep], do: - FarmbotCore.Celery.SysCalls.read_cached_pin( + FarmbotCore.Celery.SysCallGlue.read_cached_pin( unquote(Compiler.celery_to_elixir(ast, cs_scope)) ) @@ -118,7 +120,9 @@ defmodule FarmbotCore.Celery.Compiler.If do # nothing() # end quote location: :keep do - prefix_string = FarmbotCore.Celery.SysCalls.format_lhs(unquote(lhs_ast)) + prefix_string = + FarmbotCore.Celery.SysCallGlue.format_lhs(unquote(lhs_ast)) + # examples: # "current x position is 100" # "pin 13 > 1" @@ -133,17 +137,21 @@ defmodule FarmbotCore.Celery.Compiler.If do end if unquote(if_eval) do - FarmbotCore.Celery.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.log( "Evaluated IF statement: #{result_str}; #{unquote(truthy_suffix)}" ) - unquote(FarmbotCore.Celery.Compiler.Utils.compile_block(then_ast, cs_scope)) + unquote( + FarmbotCore.Celery.Compiler.Utils.compile_block(then_ast, cs_scope) + ) else - FarmbotCore.Celery.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.log( "Evaluated IF statement: #{result_str}; #{unquote(falsey_suffix)}" ) - unquote(FarmbotCore.Celery.Compiler.Utils.compile_block(else_ast, cs_scope)) + unquote( + FarmbotCore.Celery.Compiler.Utils.compile_block(else_ast, cs_scope) + ) end end end diff --git a/farmbot_core/lib/celery/compilers/lua.ex b/lib/celery/compilers/lua.ex similarity index 69% rename from farmbot_core/lib/celery/compilers/lua.ex rename to lib/celery/compilers/lua.ex index 8c22d1f45..39387f809 100644 --- a/farmbot_core/lib/celery/compilers/lua.ex +++ b/lib/celery/compilers/lua.ex @@ -1,6 +1,6 @@ defmodule FarmbotCore.Celery.Compiler.Lua do - alias FarmbotCore.Celery.SysCalls - alias FarmbotCore.Celery.Compiler.{ VariableTransformer, Scope, } + alias FarmbotCore.Celery.SysCallGlue + alias FarmbotCore.Celery.Compiler.{VariableTransformer, Scope} def lua(%{args: %{lua: lua}}, cs_scope) do quote location: :keep do @@ -10,12 +10,17 @@ defmodule FarmbotCore.Celery.Compiler.Lua do end end - def do_lua(lua_state, cs_scope) do + # Convert a CeleryScript scope object to a Luerl table + # structure. + def scope_to_lua(cs_scope) do # Alias `variable()` and `variables()` for convenience. aliases = [:variable, :variables] lookup = generate_lookup_fn(cs_scope) - args = Enum.map(aliases, fn name -> [[name], lookup] end) - SysCalls.perform_lua(lua_state, args, nil) + Enum.map(aliases, fn name -> [[name], lookup] end) + end + + def do_lua(lua_state, cs_scope) do + SysCallGlue.perform_lua(lua_state, scope_to_lua(cs_scope), nil) end def generate_lookup_fn(cs_scope) do diff --git a/farmbot_core/lib/celery/compilers/move_compiler.ex b/lib/celery/compilers/move_compiler.ex similarity index 86% rename from farmbot_core/lib/celery/compilers/move_compiler.ex rename to lib/celery/compilers/move_compiler.ex index 75534591c..49702b274 100644 --- a/farmbot_core/lib/celery/compilers/move_compiler.ex +++ b/lib/celery/compilers/move_compiler.ex @@ -1,5 +1,5 @@ defmodule FarmbotCore.Celery.Compiler.Move do - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue alias FarmbotCore.Celery.SpecialValue alias FarmbotCore.Celery.Compiler.Scope @@ -22,19 +22,20 @@ defmodule FarmbotCore.Celery.Compiler.Move do # tranform it to a `numeric` node type. def preprocess_lua(body, cs_scope) do Enum.map(body, fn - %{ args: %{ speed_setting: %{ args: %{lua: lua} } }} = p -> + %{args: %{speed_setting: %{args: %{lua: lua}}}} = p -> data = convert_lua_to_number(lua, cs_scope) new_setting = %{kind: :numeric, args: %{number: data}} - %{ p | args: %{ speed_setting: new_setting } } + %{p | args: %{speed_setting: new_setting}} %{args: %{lua: lua}} = p -> data = convert_lua_to_number(lua, cs_scope) - %{ p | args: %{kind: :numeric, args: %{number: data}} } + %{p | args: %{kind: :numeric, args: %{number: data}}} - %{ args: %{ axis_operand: %{ args: %{lua: lua} } } } = p -> + %{args: %{axis_operand: %{args: %{lua: lua}}}} = p -> data = convert_lua_to_number(lua, cs_scope) new_operand = %{args: %{number: data}, kind: :numeric} - %{ p | args: %{ p.args | axis_operand: new_operand } } + %{p | args: %{p.args | axis_operand: new_operand}} + # Non-Lua nodes just pass through. item -> item @@ -119,17 +120,21 @@ defmodule FarmbotCore.Celery.Compiler.Move do mapper = &FarmbotCore.Celery.Compiler.Move.mapper/1 # Move X/Y operations to the front of the list and move # Z operations to the back, but DO NOT SORT!: - {xy, z} = initial_state() ++ Enum.map(body, mapper) - |> Enum.split_with(fn - {:safe_z, _, _} -> - false - {:speed_z, _, _} -> - false - {:z, _, _} -> - false - _ -> - true - end) + {xy, z} = + (initial_state() ++ Enum.map(body, mapper)) + |> Enum.split_with(fn + {:safe_z, _, _} -> + false + + {:speed_z, _, _} -> + false + + {:z, _, _} -> + false + + _ -> + true + end) xy ++ z end @@ -141,9 +146,10 @@ defmodule FarmbotCore.Celery.Compiler.Move do end def reducer({_, _, {:skip, :soil_height}}, state) do - z = state - |> Map.take([:x, :y]) - |> SpecialValue.soil_height() + z = + state + |> Map.take([:x, :y]) + |> SpecialValue.soil_height() Map.put(state, :z, z) end @@ -213,11 +219,11 @@ defmodule FarmbotCore.Celery.Compiler.Move do # This usually happens when `identifier`s are converted to # real values def to_number(axis, %{resource_id: id, resource_type: t}) do - Map.fetch!(SysCalls.point(t, id), axis) + Map.fetch!(SysCallGlue.point(t, id), axis) end def to_number(axis, %{args: %{pointer_id: id, pointer_type: t}}) do - Map.fetch!(SysCalls.point(t, id), axis) + Map.fetch!(SysCallGlue.point(t, id), axis) end def to_number(_, %{args: %{label: "safe_height"}, kind: :special_value}) do @@ -243,7 +249,7 @@ defmodule FarmbotCore.Celery.Compiler.Move do end def to_number(axis, %{kind: :tool, args: %{tool_id: id}}) do - tool = FarmbotCore.Celery.SysCalls.get_toolslot_for_tool(id) + tool = FarmbotCore.Celery.SysCallGlue.get_toolslot_for_tool(id) to_number(axis, tool) end @@ -257,14 +263,14 @@ defmodule FarmbotCore.Celery.Compiler.Move do z_str = FarmbotCore.Celery.FormatUtil.format_float(z) msg = "Moving to (#{x_str}, #{y_str}, #{z_str})" - FarmbotCore.Celery.SysCalls.log(msg, true) - :ok = SysCalls.move_absolute(x, y, z, sx, sy, sz) + FarmbotCore.Celery.SysCallGlue.log(msg, true) + :ok = SysCallGlue.move_absolute(x, y, z, sx, sy, sz) k end - def cx, do: SysCalls.get_current_x() - def cy, do: SysCalls.get_current_y() - def cz, do: SysCalls.get_current_z() + def cx, do: SysCallGlue.get_current_x() + def cy, do: SysCallGlue.get_current_y() + def cz, do: SysCallGlue.get_current_z() def convert_lua_to_number(lua, cs_scope) do case FarmbotCore.Celery.Compiler.Lua.do_lua(lua, cs_scope) do diff --git a/farmbot_core/lib/celery/compilers/pin_control_compiler.ex b/lib/celery/compilers/pin_control_compiler.ex similarity index 62% rename from farmbot_core/lib/celery/compilers/pin_control_compiler.ex rename to lib/celery/compilers/pin_control_compiler.ex index 90753b5a6..eb8a19114 100644 --- a/farmbot_core/lib/celery/compilers/pin_control_compiler.ex +++ b/lib/celery/compilers/pin_control_compiler.ex @@ -1,13 +1,16 @@ defmodule FarmbotCore.Celery.Compiler.PinControl do alias FarmbotCore.Celery.Compiler - def write_pin(%{args: %{pin_number: num, pin_mode: mode, pin_value: value}}, cs_scope) do + def write_pin( + %{args: %{pin_number: num, pin_mode: mode, pin_value: value}}, + cs_scope + ) do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(num, cs_scope)) mode = unquote(Compiler.celery_to_elixir(mode, cs_scope)) value = unquote(Compiler.celery_to_elixir(value, cs_scope)) - with :ok <- FarmbotCore.Celery.SysCalls.write_pin(pin, mode, value) do + with :ok <- FarmbotCore.Celery.SysCallGlue.write_pin(pin, mode, value) do me = unquote(__MODULE__) me.conclude(pin, mode, value) end @@ -19,43 +22,47 @@ defmodule FarmbotCore.Celery.Compiler.PinControl do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(num, cs_scope)) mode = unquote(Compiler.celery_to_elixir(mode, cs_scope)) - FarmbotCore.Celery.SysCalls.read_pin(pin, mode) + FarmbotCore.Celery.SysCallGlue.read_pin(pin, mode) end end # compiles set_servo_angle def set_servo_angle( - %{args: %{pin_number: pin_number, pin_value: pin_value}}, cs_scope) do + %{args: %{pin_number: pin_number, pin_value: pin_value}}, + cs_scope + ) do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(pin_number, cs_scope)) angle = unquote(Compiler.celery_to_elixir(pin_value, cs_scope)) - FarmbotCore.Celery.SysCalls.log("Writing servo: #{pin}: #{angle}") - FarmbotCore.Celery.SysCalls.set_servo_angle(pin, angle) + FarmbotCore.Celery.SysCallGlue.log("Writing servo: #{pin}: #{angle}") + FarmbotCore.Celery.SysCallGlue.set_servo_angle(pin, angle) end end # compiles set_pin_io_mode def set_pin_io_mode( - %{args: %{pin_number: pin_number, pin_io_mode: mode}}, cs_scope) do + %{args: %{pin_number: pin_number, pin_io_mode: mode}}, + cs_scope + ) do quote location: :keep do pin = unquote(Compiler.celery_to_elixir(pin_number, cs_scope)) mode = unquote(Compiler.celery_to_elixir(mode, cs_scope)) - FarmbotCore.Celery.SysCalls.log("Setting pin mode: #{pin}: #{mode}") - FarmbotCore.Celery.SysCalls.set_pin_io_mode(pin, mode) + FarmbotCore.Celery.SysCallGlue.log("Setting pin mode: #{pin}: #{mode}") + FarmbotCore.Celery.SysCallGlue.set_pin_io_mode(pin, mode) end end def toggle_pin(%{args: %{pin_number: pin_number}}, _cs_scope) do quote location: :keep do - FarmbotCore.Celery.SysCalls.toggle_pin(unquote(pin_number)) + FarmbotCore.Celery.SysCallGlue.toggle_pin(unquote(pin_number)) end end def conclude(pin, 0, _value) do - FarmbotCore.Celery.SysCalls.read_pin(pin, 0) + FarmbotCore.Celery.SysCallGlue.read_pin(pin, 0) end def conclude(pin, _mode, value) do - FarmbotCore.Celery.SysCalls.log("Pin #{pin} is #{value} (analog)") + FarmbotCore.Celery.SysCallGlue.log("Pin #{pin} is #{value} (analog)") end end diff --git a/farmbot_core/lib/celery/compilers/rpc_request_compiler.ex b/lib/celery/compilers/rpc_request_compiler.ex similarity index 80% rename from farmbot_core/lib/celery/compilers/rpc_request_compiler.ex rename to lib/celery/compilers/rpc_request_compiler.ex index 52b354222..586c106ae 100644 --- a/farmbot_core/lib/celery/compilers/rpc_request_compiler.ex +++ b/lib/celery/compilers/rpc_request_compiler.ex @@ -1,8 +1,10 @@ defmodule FarmbotCore.Celery.Compiler.RPCRequest do alias FarmbotCore.Celery.Compiler.Utils + def rpc_request(%{args: %{label: _label}, body: block}, cs_scope) do - steps = Utils.compile_block(block, cs_scope) - |> Utils.decompose_block_to_steps() + steps = + Utils.compile_block(block, cs_scope) + |> Utils.decompose_block_to_steps() [ quote location: :keep do diff --git a/farmbot_core/lib/celery/compilers/scope.ex b/lib/celery/compilers/scope.ex similarity index 83% rename from farmbot_core/lib/celery/compilers/scope.ex rename to lib/celery/compilers/scope.ex index 3ee76d6f7..f4ae6fa21 100644 --- a/farmbot_core/lib/celery/compilers/scope.ex +++ b/lib/celery/compilers/scope.ex @@ -15,7 +15,7 @@ defmodule FarmbotCore.Celery.Compiler.Scope do def new(), do: new(nil, []) def new(parent_scope, declaration_array) do - %__MODULE__{ parent: parent_scope } + %__MODULE__{parent: parent_scope} |> apply_declarations(declaration_array) end @@ -44,7 +44,7 @@ defmodule FarmbotCore.Celery.Compiler.Scope do def has_key?(scope, label), do: Map.has_key?(scope.declarations, label) def set(scope, key, value) do - %{ scope | declarations: Map.put(scope.declarations, key, value) } + %{scope | declarations: Map.put(scope.declarations, key, value)} end # GIVEN A scope object and a label @@ -75,9 +75,11 @@ defmodule FarmbotCore.Celery.Compiler.Scope do {:identifier, key, value} -> {:ok, new_value} = fetch!(scope.parent, value.args.label) {key, new_value} - {_, key, value} -> {key, value} + + {_, key, value} -> + {key, value} end) - |> Enum.reduce(scope, fn {k,v}, declr -> set(declr, k, v) end) + |> Enum.reduce(scope, fn {k, v}, declr -> set(declr, k, v) end) end # This function matters when dealing with point groups. @@ -95,18 +97,21 @@ defmodule FarmbotCore.Celery.Compiler.Scope do case FarmbotCore.Asset.find_points_via_group(group_id) do nil -> {:error, "Point group not found: #{label}/#{group_id}"} + pg -> group_size = Enum.count(pg.point_ids) + pg |> Map.fetch!(:point_ids) |> Enum.map(&point/1) |> Enum.with_index(1) - |> Enum.map(fn { point_ast, index } -> - meta = %{ name: pg.name, current_index: index, size: group_size } + |> Enum.map(fn {point_ast, index} -> + meta = %{name: pg.name, current_index: index, size: group_size} + scope |> set(label, point_ast) |> set("__GROUP__", meta) - end) + end) end end @@ -114,8 +119,8 @@ defmodule FarmbotCore.Celery.Compiler.Scope do # Return value is a tuple in the form {label, point_group_id} defp get_point_group_ids(scope) do scope.declarations - |> Enum.filter(fn {_k, v} -> v.kind == :point_group end) - |> Enum.map(fn {k, v} -> {k, v.args.point_group_id} end) + |> Enum.filter(fn {_k, v} -> v.kind == :point_group end) + |> Enum.map(fn {k, v} -> {k, v.args.point_group_id} end) end # Helper function that generates a `:point` %AST{}. @@ -130,16 +135,19 @@ defmodule FarmbotCore.Celery.Compiler.Scope do end defp warn_user_of_bad_var_name!(scope, label) do - vars = scope.declarations - |> Map.keys() - |> Enum.map(&inspect/1) + vars = + scope.declarations + |> Map.keys() + |> Enum.map(&inspect/1) - msg = if Enum.count(vars) == 0 do - "Attempted to access variable #{inspect(label)}, but no variables are declared." + msg = + if Enum.count(vars) == 0 do + "Attempted to access variable #{inspect(label)}, but no variables are declared." else all = Enum.join(vars, ", ") "Can't find variable #{inspect(label)}. Available variables: " <> all end - {:error, msg} + + {:error, msg} end end diff --git a/farmbot_core/lib/celery/compilers/sequence_compiler.ex b/lib/celery/compilers/sequence_compiler.ex similarity index 71% rename from farmbot_core/lib/celery/compilers/sequence_compiler.ex rename to lib/celery/compilers/sequence_compiler.ex index caa6b5527..7736a53a6 100644 --- a/farmbot_core/lib/celery/compilers/sequence_compiler.ex +++ b/lib/celery/compilers/sequence_compiler.ex @@ -1,5 +1,6 @@ defmodule FarmbotCore.Celery.Compiler.Sequence do - alias FarmbotCore.Celery.Compiler.{ Scope, Utils } + alias FarmbotCore.Celery.Compiler.{Scope, Utils} + def sequence(ast, cs_scope) do sequence_header = ast.args.locals.body # Apply defaults declared by sequence @@ -13,10 +14,15 @@ defmodule FarmbotCore.Celery.Compiler.Sequence do defp compile_expanded_sequences(cs_scope_array, ast) do Enum.map(cs_scope_array, fn cs_scope -> - steps = ast.body - |> Utils.compile_block(cs_scope) - |> Utils.decompose_block_to_steps() - |> Utils.add_init_logs(cs_scope, Map.get(ast.args, :sequence_name, "sequence")) + steps = + ast.body + |> Utils.compile_block(cs_scope) + |> Utils.decompose_block_to_steps() + |> Utils.add_init_logs( + cs_scope, + Map.get(ast.args, :sequence_name, "sequence") + ) + quote location: :keep do fn -> cs_scope = unquote(cs_scope) diff --git a/farmbot_core/lib/celery/compilers/update_resource_compiler.ex b/lib/celery/compilers/update_resource_compiler.ex similarity index 84% rename from farmbot_core/lib/celery/compilers/update_resource_compiler.ex rename to lib/celery/compilers/update_resource_compiler.ex index 9ec1d9ae3..1e7f821f6 100644 --- a/farmbot_core/lib/celery/compilers/update_resource_compiler.ex +++ b/lib/celery/compilers/update_resource_compiler.ex @@ -3,16 +3,21 @@ defmodule FarmbotCore.Celery.Compiler.UpdateResource do def update_resource(%AST{args: args, body: body}, cs_scope) do update = unpair(body, %{}) + quote location: :keep do me = unquote(__MODULE__) variable = unquote(Map.fetch!(args, :resource)) update = unquote(update) cs_scope = unquote(cs_scope) + case variable do %FarmbotCore.Celery.AST{kind: :identifier} -> args = Map.fetch!(variable, :args) label = Map.fetch!(args, :label) - {:ok, resource} = FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, label) + + {:ok, resource} = + FarmbotCore.Celery.Compiler.Scope.fetch!(cs_scope, label) + me.do_update(resource, update) %FarmbotCore.Celery.AST{kind: :point} -> @@ -28,15 +33,15 @@ defmodule FarmbotCore.Celery.Compiler.UpdateResource do end def do_update(%{pointer_id: id, pointer_type: kind}, update_params) do - FarmbotCore.Celery.SysCalls.update_resource(kind, id, update_params) + FarmbotCore.Celery.SysCallGlue.update_resource(kind, id, update_params) end def do_update(%{resource_id: id, resource_type: kind}, update_params) do - FarmbotCore.Celery.SysCalls.update_resource(kind, id, update_params) + FarmbotCore.Celery.SysCallGlue.update_resource(kind, id, update_params) end def do_update(%{args: %{pointer_id: id, pointer_type: k}}, update_params) do - FarmbotCore.Celery.SysCalls.update_resource(k, id, update_params) + FarmbotCore.Celery.SysCallGlue.update_resource(k, id, update_params) end def do_update(other, update) do diff --git a/farmbot_core/lib/celery/compilers/variable_transformer.ex b/lib/celery/compilers/variable_transformer.ex similarity index 74% rename from farmbot_core/lib/celery/compilers/variable_transformer.ex rename to lib/celery/compilers/variable_transformer.ex index 1506ecb5f..a3b38af3b 100644 --- a/farmbot_core/lib/celery/compilers/variable_transformer.ex +++ b/lib/celery/compilers/variable_transformer.ex @@ -1,15 +1,14 @@ # Ensure that every "location like" CeleryScript variable has # an x/y/z property at the root of the object. defmodule FarmbotCore.Celery.Compiler.VariableTransformer do - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue - def run!(%{ resource_id: id, resource_type: t }) do - [SysCalls.point(t, id)] + def run!(%{resource_id: id, resource_type: t}) do + [SysCallGlue.point(t, id)] end - def run!(%{args: %{pointer_id: id, pointer_type: t}}) do - [SysCalls.point(t, id)] + [SysCallGlue.point(t, id)] end def run!(%{x: _, y: _, z: _} = vec), do: [vec] @@ -19,7 +18,7 @@ defmodule FarmbotCore.Celery.Compiler.VariableTransformer do end def run!(%{args: %{tool_id: tool_id}}) do - [FarmbotCore.Celery.SysCalls.get_toolslot_for_tool(tool_id)] + [FarmbotCore.Celery.SysCallGlue.get_toolslot_for_tool(tool_id)] end def run!(nil) do diff --git a/farmbot_core/lib/celery/corpus.ex b/lib/celery/corpus.ex similarity index 96% rename from farmbot_core/lib/celery/corpus.ex rename to lib/celery/corpus.ex index 3a30f4d5a..bb6bfb2d7 100644 --- a/farmbot_core/lib/celery/corpus.ex +++ b/lib/celery/corpus.ex @@ -1,7 +1,7 @@ defmodule FarmbotCore.Celery.Corpus do alias FarmbotCore.Celery.{Corpus, Corpus.Node, Corpus.Arg} - @corpus_file "fixture/corpus.json" + @corpus_file "fixtures/corpus.json" @external_resource @corpus_file %{"args" => args, "nodes" => nodes, "version" => tag} = @@ -110,9 +110,7 @@ defmodule FarmbotCore.Celery.Corpus do args = Enum.map(allowed_args, fn %{name: name, doc: doc} -> """ - * [#{name}](#module-#{String.replace(name, "_", "")}) #{ - if doc, do: "- " <> doc - } + * [#{name}](#module-#{String.replace(name, "_", "")}) #{if doc, do: "- " <> doc} """ end) @@ -124,9 +122,7 @@ defmodule FarmbotCore.Celery.Corpus do body = Enum.map(allowed_body_types, fn name -> """ - * [#{name}](#module-#{String.replace(name, "_", "")}) #{ - if doc, do: "- " <> doc - } + * [#{name}](#module-#{String.replace(name, "_", "")}) #{if doc, do: "- " <> doc} """ end) diff --git a/farmbot_core/lib/celery/corpus/arg.ex b/lib/celery/corpus/arg.ex similarity index 100% rename from farmbot_core/lib/celery/corpus/arg.ex rename to lib/celery/corpus/arg.ex diff --git a/farmbot_core/lib/celery/corpus/node.ex b/lib/celery/corpus/node.ex similarity index 100% rename from farmbot_core/lib/celery/corpus/node.ex rename to lib/celery/corpus/node.ex diff --git a/farmbot_core/lib/celery/dot_props.ex b/lib/celery/dot_props.ex similarity index 100% rename from farmbot_core/lib/celery/dot_props.ex rename to lib/celery/dot_props.ex diff --git a/farmbot_core/lib/celery/format_util.ex b/lib/celery/format_util.ex similarity index 100% rename from farmbot_core/lib/celery/format_util.ex rename to lib/celery/format_util.ex diff --git a/farmbot_core/lib/celery/interpolation.ex b/lib/celery/interpolation.ex similarity index 51% rename from farmbot_core/lib/celery/interpolation.ex rename to lib/celery/interpolation.ex index 76be3904d..4ce8ffafb 100644 --- a/farmbot_core/lib/celery/interpolation.ex +++ b/lib/celery/interpolation.ex @@ -1,17 +1,22 @@ defmodule FarmbotCore.Celery.Interpolation do - # Given the current X/Y position and a list of soil height samples, provides + # Given the current X/Y position and a list of soil height samples, provides # the current Z coordinate via inverse distance weighting. def guess_z_value(soil_points, current_xy) do nearest = nearest_neighbor(soil_points, current_xy) + if nearest.distance == 0 do nearest.z else - dividend = soil_points - |> Enum.map(fn p -> (1 / :math.pow(dist(current_xy, p), 4)) * p.z end) - |> Enum.sum() - divisor = soil_points - |> Enum.map(fn p -> (1 / :math.pow(dist(current_xy, p), 4)) end) - |> Enum.sum() + dividend = + soil_points + |> Enum.map(fn p -> 1 / :math.pow(dist(current_xy, p), 4) * p.z end) + |> Enum.sum() + + divisor = + soil_points + |> Enum.map(fn p -> 1 / :math.pow(dist(current_xy, p), 4) end) + |> Enum.sum() + Float.round(dividend / divisor, 2) end end @@ -23,11 +28,11 @@ defmodule FarmbotCore.Celery.Interpolation do end defp nearest_neighbor(all_points, target_xy) do - all_points - |> Enum.map(fn p -> - %{ x: p.x, y: p.y, z: p.z, distance: dist(target_xy, p) } - end) - |> Enum.sort_by(fn p -> p.distance end) - |> Enum.at(0) + all_points + |> Enum.map(fn p -> + %{x: p.x, y: p.y, z: p.z, distance: dist(target_xy, p)} + end) + |> Enum.sort_by(fn p -> p.distance end) + |> Enum.at(0) end end diff --git a/farmbot_core/lib/celery/runtime_error.ex b/lib/celery/runtime_error.ex similarity index 100% rename from farmbot_core/lib/celery/runtime_error.ex rename to lib/celery/runtime_error.ex diff --git a/farmbot_core/lib/celery/scheduler.ex b/lib/celery/scheduler.ex similarity index 99% rename from farmbot_core/lib/celery/scheduler.ex rename to lib/celery/scheduler.ex index 433570fb6..a8cec9cc8 100644 --- a/farmbot_core/lib/celery/scheduler.ex +++ b/lib/celery/scheduler.ex @@ -27,7 +27,7 @@ defmodule FarmbotCore.Celery.Scheduler do @grace_period_ms 900_000 defmodule Dispatch do - defstruct [ :scheduled_at, :data ] + defstruct [:scheduled_at, :data] end defstruct next: nil, @@ -188,6 +188,7 @@ defmodule FarmbotCore.Celery.Scheduler do @spec execute_next(state()) :: state() defp execute_next(%{next: {ast, at, _data, pid}} = state) do scheduler_pid = self() + scheduled_pid = spawn(fn -> StepRunner.begin(scheduler_pid, {at, DateTime.utc_now(), pid}, ast) diff --git a/farmbot_core/lib/celery/special_value.ex b/lib/celery/special_value.ex similarity index 81% rename from farmbot_core/lib/celery/special_value.ex rename to lib/celery/special_value.ex index f37c08b28..145ff560b 100644 --- a/farmbot_core/lib/celery/special_value.ex +++ b/lib/celery/special_value.ex @@ -1,18 +1,19 @@ defmodule FarmbotCore.Celery.SpecialValue do alias FarmbotCore.Celery.Interpolation - alias FarmbotCore.Asset.{ Repo, Point } + alias FarmbotCore.Asset.{Repo, Point} import Ecto.Query require FarmbotCore.Logger require Logger - @msg "Need at least 3 soil height samples to guess soil height. " - <> "Using fallback value instead: " + @msg "Need at least 3 soil height samples to guess soil height. " <> + "Using fallback value instead: " def safe_height() do FarmbotCore.Asset.fbos_config(:safe_height) || 0.0 end def soil_height(%{x: _, y: _} = xy) do points = soil_samples() + if Enum.count(points) < 3 do fallback = FarmbotCore.Asset.fbos_config(:soil_height) || 0.0 FarmbotCore.Logger.warn(3, @msg <> inspect(fallback)) @@ -23,7 +24,10 @@ defmodule FarmbotCore.Celery.SpecialValue do end def soil_samples do - from(p in Point, where: like(p.meta, "%at_soil_level%"), order_by: p.updated_at) + from(p in Point, + where: like(p.meta, "%at_soil_level%"), + order_by: p.updated_at + ) |> Repo.all() |> Enum.filter(&is_soil_sample?/1) |> index_by_location() @@ -49,10 +53,11 @@ defmodule FarmbotCore.Celery.SpecialValue do list |> Enum.reduce(%{}, fn %{x: x, y: y} = value, acc -> - # If two values have the same X/Y coords, last write - # wins. - key = {round_to_10(x), round_to_10(y)} - Map.put(acc, key, value) + # If two values have the same X/Y coords, last write + # wins. + key = {round_to_10(x), round_to_10(y)} + Map.put(acc, key, value) + _, acc -> acc end) diff --git a/farmbot_core/lib/celery/step_runner.ex b/lib/celery/step_runner.ex similarity index 91% rename from farmbot_core/lib/celery/step_runner.ex rename to lib/celery/step_runner.ex index e75fd4045..2fbb3cf1e 100644 --- a/farmbot_core/lib/celery/step_runner.ex +++ b/lib/celery/step_runner.ex @@ -6,6 +6,7 @@ defmodule FarmbotCore.Celery.StepRunner do alias FarmbotCore.Celery.Compiler.Scope require Logger + @doc """ Steps through an entire AST. """ @@ -48,7 +49,10 @@ defmodule FarmbotCore.Celery.StepRunner do end defp not_ok(listener, tag, original_error, trace \\ nil) do - Logger.warn("CeleryScript Exception: #{inspect(original_error)} / #{inspect(trace)}") + Logger.warn( + "CeleryScript Exception: #{inspect(original_error)} / #{inspect(trace)}" + ) + error = format_error(original_error) send(listener, {:csvm_done, tag, error}) error @@ -58,7 +62,10 @@ defmodule FarmbotCore.Celery.StepRunner do defp format_error(%{term: e}), do: format_error(e) defp format_error({:badmatch, error}), do: format_error(error) defp format_error({:error, {:error, e}}), do: format_error(e) - defp format_error({:error, {:badmatch, error}}), do: format_error({:error, error}) + + defp format_error({:error, {:badmatch, error}}), + do: format_error({:error, error}) + defp format_error({:error, e}) when is_binary(e), do: {:error, e} defp format_error({:error, e}), do: {:error, inspect(e)} defp format_error(err) when is_binary(err), do: {:error, err} diff --git a/farmbot_core/lib/celery/sys_calls.ex b/lib/celery/sys_call_glue.ex similarity index 98% rename from farmbot_core/lib/celery/sys_calls.ex rename to lib/celery/sys_call_glue.ex index c5f0a3aee..e03f522cb 100644 --- a/farmbot_core/lib/celery/sys_calls.ex +++ b/lib/celery/sys_call_glue.ex @@ -1,13 +1,13 @@ -defmodule FarmbotCore.Celery.SysCalls do +defmodule FarmbotCore.Celery.SysCallGlue do @moduledoc """ Behaviour for abstracting CeleryScript functionality. """ alias FarmbotCore.Celery.{AST, RuntimeError} - @sys_calls Application.get_env(:farmbot_core, __MODULE__)[:sys_calls] + @sys_calls Application.get_env(:farmbot, __MODULE__)[:sys_calls] @sys_calls || Mix.raise(""" - config :farmbot_core, FarmbotCore.Celery.SysCalls, [ + config :farmbot, FarmbotCore.Celery.SysCallGlue, [ sys_calls: SomeModuleThatImplementsTheBehaviour ] """) diff --git a/farmbot_core/lib/celery/sys_calls/stubs.ex b/lib/celery/sys_calls/stubs.ex similarity index 97% rename from farmbot_core/lib/celery/sys_calls/stubs.ex rename to lib/celery/sys_calls/stubs.ex index f338fd09c..87e6e6fec 100644 --- a/farmbot_core/lib/celery/sys_calls/stubs.ex +++ b/lib/celery/sys_calls/stubs.ex @@ -1,8 +1,8 @@ -defmodule FarmbotCore.Celery.SysCalls.Stubs do +defmodule FarmbotCore.Celery.SysCallGlue.Stubs do @moduledoc """ SysCall implementation that doesn't do anything. Useful for tests. """ - @behaviour FarmbotCore.Celery.SysCalls + @behaviour FarmbotCore.Celery.SysCallGlue require Logger diff --git a/farmbot_core/lib/farmbot_core/asset.ex b/lib/core/asset.ex similarity index 85% rename from farmbot_core/lib/farmbot_core/asset.ex rename to lib/core/asset.ex index cce5ad8ac..95967a57f 100644 --- a/farmbot_core/lib/farmbot_core/asset.ex +++ b/lib/core/asset.ex @@ -25,10 +25,10 @@ defmodule FarmbotCore.Asset do Sensor, SensorReading, Sequence, - Tool, + Tool } - alias FarmbotCore.AssetSupervisor + alias FarmbotCore.ChangeSupervisor import Ecto.Query require Logger @@ -113,7 +113,8 @@ defmodule FarmbotCore.Asset do e.scheduled_at == ^scheduled_at, limit: 1 ) - ) |> Enum.at(0) + ) + |> Enum.at(0) end ## End FarmEvent @@ -140,7 +141,7 @@ defmodule FarmbotCore.Asset do FbosConfig.changeset(fbos_config || fbos_config(), params) |> Repo.insert_or_update!() - AssetSupervisor.cast_child(new_data, {:new_data, new_data}) + ChangeSupervisor.cast_child(new_data, {:new_data, new_data}) new_data end @@ -169,7 +170,7 @@ defmodule FarmbotCore.Asset do FirmwareConfig.changeset(firmware_config || firmware_config(), params) |> Repo.insert_or_update!() - AssetSupervisor.cast_child(new_data, {:new_data, new_data}) + ChangeSupervisor.cast_child(new_data, {:new_data, new_data}) new_data end @@ -193,18 +194,22 @@ defmodule FarmbotCore.Asset do end def get_regimen_instance(%FarmEvent{} = farm_event) do - regimen = Repo.one(from(r in Regimen, where: r.id == ^farm_event.executable_id)) + regimen = + Repo.one(from(r in Regimen, where: r.id == ^farm_event.executable_id)) regimen && Repo.one( from(ri in RegimenInstance, - where: ri.regimen_id == ^regimen.local_id and ri.farm_event_id == ^farm_event.local_id + where: + ri.regimen_id == ^regimen.local_id and + ri.farm_event_id == ^farm_event.local_id ) ) end def new_regimen_instance!(%FarmEvent{} = farm_event, params \\ %{}) do - regimen = Repo.one!(from(r in Regimen, where: r.id == ^farm_event.executable_id)) + regimen = + Repo.one!(from(r in Regimen, where: r.id == ^farm_event.executable_id)) RegimenInstance.changeset(%RegimenInstance{}, params) |> Ecto.Changeset.put_assoc(:regimen, regimen) @@ -231,7 +236,8 @@ defmodule FarmbotCore.Asset do e.scheduled_at == ^scheduled_at, limit: 1 ) - ) |> Enum.at(0) + ) + |> Enum.at(0) end ## End RegimenInstance @@ -260,13 +266,15 @@ defmodule FarmbotCore.Asset do # by default, not a merge action. # MORE NOTES: Mixed keys (symbol vs. string) will crash this FN. # Let's just stringify everything... - new_meta = params[:meta] || params["meta"] || %{} - old_meta = point.meta || %{} + new_meta = params[:meta] || params["meta"] || %{} + old_meta = point.meta || %{} updated_meta = Map.merge(old_meta, new_meta) - clean_params = params - |> Map.merge(%{meta: updated_meta}) - |> Enum.map(fn {k, v} -> {"#{k}", v} end) - |> Map.new() + + clean_params = + params + |> Map.merge(%{meta: updated_meta}) + |> Enum.map(fn {k, v} -> {"#{k}", v} end) + |> Map.new() Repo.get_by(Point, id: point.id) |> Point.changeset(clean_params) @@ -284,19 +292,31 @@ defmodule FarmbotCore.Asset do points |> Enum.group_by(&group_points_by(&1, order_by)) |> Enum.sort(&group_sort(&1, &2, order_by)) - |> Enum.map(fn {_group_index, group} -> Enum.sort(group, &sort_points(&1, &2, order_by)) end) + |> Enum.map(fn {_group_index, group} -> + Enum.sort(group, &sort_points(&1, &2, order_by)) + end) |> List.flatten() end - def group_points_by(%{x: x}, algo) when algo in ~w(xy_ascending xy_descending), do: x - def group_points_by(%{y: y}, algo) when algo in ~w(yx_ascending yx_descending), do: y + def group_points_by(%{x: x}, algo) + when algo in ~w(xy_ascending xy_descending), + do: x + + def group_points_by(%{y: y}, algo) + when algo in ~w(yx_ascending yx_descending), + do: y + def group_points_by(%{x: x, y: y}, "random"), do: Enum.random([x, y]) def group_sort({lgroup, _}, {rgroup, _}, "xy_ascending"), do: lgroup <= rgroup def group_sort({lgroup, _}, {rgroup, _}, "yx_ascending"), do: lgroup <= rgroup - def group_sort({lgroup, _}, {rgroup, _}, "xy_descending"), do: lgroup >= rgroup - def group_sort({lgroup, _}, {rgroup, _}, "yx_descending"), do: lgroup >= rgroup + def group_sort({lgroup, _}, {rgroup, _}, "xy_descending"), + do: lgroup >= rgroup + + def group_sort({lgroup, _}, {rgroup, _}, "yx_descending"), + do: lgroup >= rgroup + def group_sort(_, _, "random"), do: Enum.random([true, false]) def sort_points(%{y: ly}, %{y: ry}, "xy_ascending"), do: ly <= ry @@ -338,10 +358,13 @@ defmodule FarmbotCore.Asset do # that deal with point groups- the point_ids # value is not a reflection of what is in # the DB / API. - sorted = CriteriaRetriever.run(point_group) + sorted = + CriteriaRetriever.run(point_group) |> sort_points(sort_by || "xy_ascending") |> Enum.map(fn point -> point.id end) - %{ point_group | point_ids: sorted } + + %{point_group | point_ids: sorted} + other -> # Swallow all other errors a = inspect(id) @@ -372,8 +395,11 @@ defmodule FarmbotCore.Asset do for asset <- farm_events ++ regimen_instances do # TODO(Connor) this might be worth creating a behaviour for if uses_point_group?(asset, point_group) do - Logger.debug("#{inspect(asset)} uses PointGroup: #{inspect(point_group)}. Reindexing it.") - FarmbotCore.AssetSupervisor.update_child(asset) + Logger.debug( + "#{inspect(asset)} uses PointGroup: #{inspect(point_group)}. Reindexing it." + ) + + FarmbotCore.ChangeSupervisor.update_child(asset) end end @@ -388,17 +414,27 @@ defmodule FarmbotCore.Asset do any_body_node_uses_point_group?(body, point_group_id) end - def uses_point_group?(%Regimen{body: body, regimen_items: regimen_items}, %PointGroup{ - id: point_group_id - }) do + def uses_point_group?( + %Regimen{body: body, regimen_items: regimen_items}, + %PointGroup{ + id: point_group_id + } + ) do any_body_node_uses_point_group?(body, point_group_id) || Enum.find(regimen_items, fn %{sequence_id: sequence_id} -> - any_body_node_uses_point_group?(get_sequence(sequence_id).body, point_group_id) + any_body_node_uses_point_group?( + get_sequence(sequence_id).body, + point_group_id + ) end) end - def uses_point_group?(%RegimenInstance{farm_event: farm_event, regimen: regimen}, point_group) do - uses_point_group?(farm_event, point_group) || uses_point_group?(regimen, point_group) + def uses_point_group?( + %RegimenInstance{farm_event: farm_event, regimen: regimen}, + point_group + ) do + uses_point_group?(farm_event, point_group) || + uses_point_group?(regimen, point_group) end def any_body_node_uses_point_group?(body, point_group_id) do @@ -495,7 +531,9 @@ defmodule FarmbotCore.Asset do def delete_regimen!(regimen) do regimen_instances = - Repo.all(from(ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id)) + Repo.all( + from(ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id) + ) for ri <- regimen_instances do delete_regimen_instance!(ri) @@ -507,7 +545,9 @@ defmodule FarmbotCore.Asset do @doc "Update an existing regimen" def update_regimen!(regimen, params) do regimen_instances = - Repo.all(from(ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id)) + Repo.all( + from(ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id) + ) |> Repo.preload([:farm_event, :regimen]) for ri <- regimen_instances do @@ -558,7 +598,7 @@ defmodule FarmbotCore.Asset do end) for asset <- farm_events ++ regimen_instances do - FarmbotCore.AssetSupervisor.update_child(asset) + FarmbotCore.ChangeSupervisor.update_child(asset) end Sequence.changeset(sequence, params) @@ -576,8 +616,11 @@ defmodule FarmbotCore.Asset do @doc "Get a FarmwareManifest by it's name." def get_farmware_manifest(package) do - first_party_farmwares = Repo.all(from(fwi in FirstPartyFarmware, select: fwi.manifest)) - regular_farmwares = Repo.all(from(fwi in FarmwareInstallation, select: fwi.manifest)) + first_party_farmwares = + Repo.all(from(fwi in FirstPartyFarmware, select: fwi.manifest)) + + regular_farmwares = + Repo.all(from(fwi in FarmwareInstallation, select: fwi.manifest)) Enum.find( first_party_farmwares ++ regular_farmwares, @@ -635,7 +678,8 @@ defmodule FarmbotCore.Asset do fwe = with key when is_binary(key) <- key, - [fwe | _] <- Repo.all(from(fwe in FarmwareEnv, where: fwe.key == ^key)) do + [fwe | _] <- + Repo.all(from(fwe in FarmwareEnv, where: fwe.key == ^key)) do fwe else _ -> %FarmwareEnv{} diff --git a/farmbot_core/lib/farmbot_core/asset/box_led.ex b/lib/core/asset/box_led.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/box_led.ex rename to lib/core/asset/box_led.ex diff --git a/farmbot_core/lib/farmbot_core/asset/command.ex b/lib/core/asset/command.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/command.ex rename to lib/core/asset/command.ex diff --git a/farmbot_core/lib/farmbot_core/asset/criteria_retriever.ex b/lib/core/asset/criteria_retriever.ex similarity index 65% rename from farmbot_core/lib/farmbot_core/asset/criteria_retriever.ex rename to lib/core/asset/criteria_retriever.ex index fae1f3657..75ba46172 100644 --- a/farmbot_core/lib/farmbot_core/asset/criteria_retriever.ex +++ b/lib/core/asset/criteria_retriever.ex @@ -1,23 +1,23 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do - alias FarmbotCore.Asset.{ PointGroup, Repo, Point } + alias FarmbotCore.Asset.{PointGroup, Repo, Point} import Ecto.Query @moduledoc """ - The PointGroup asset declares a list - of criteria to query points. The CriteriaRetriever - module then converts that criteria to - a list of real points that match the - criteria of a point group. - - Example: - - You have a PointGroup with a criteria - where group.criteria.number_gt.x == 10 - Passing that PointGroup to this module - will return an array of `Point` assets - with an x property that is greater than - 10. - """ + The PointGroup asset declares a list + of criteria to query points. The CriteriaRetriever + module then converts that criteria to + a list of real points that match the + criteria of a point group. + + Example: + + You have a PointGroup with a criteria + where group.criteria.number_gt.x == 10 + Passing that PointGroup to this module + will return an array of `Point` assets + with an x property that is greater than + 10. + """ # We will not query any string/numeric fields other than these. # Updating the PointGroup / Point models may require an update @@ -34,7 +34,9 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do def run(%PointGroup{point_ids: static_ids} = pg) do # pg.point_ids is *always* include in search results, # even if it does not match pg.criteria in any way. - always_ok = Repo.all(from(p in Point, where: p.id in ^static_ids, select: p)) + always_ok = + Repo.all(from(p in Point, where: p.id in ^static_ids, select: p)) + # Now we need a list of point IDs that actually match # the pg.criteria fields. We only get the ID because # we are circumventing Ecto and doing raw SQL. @@ -50,7 +52,7 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do # There we go. We have all the matching %Point{}s search_matches = search_meta_fields(pg, needs_meta_filter) # ...but there are duplicates. We can remove them via uniq_by: - Enum.uniq_by((search_matches ++ always_ok), fn p -> p.id end) + Enum.uniq_by(search_matches ++ always_ok, fn p -> p.id end) end @doc """ @@ -64,24 +66,24 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do meta_len = String.length(meta) (pg.criteria["string_eq"] || %{}) - |> Map.to_list() - |> Enum.filter(fn {k, _v} -> - String.starts_with?(k, meta) - end) - |> Enum.map(fn {k, value} -> - clean_key = String.slice(k, ((meta_len)..-1)) - {clean_key, value} - end) - |> Enum.reduce(%{}, fn {key, value}, all -> - all_values = all[key] || [] - Map.merge(all, %{key => value ++ all_values}) - end) - |> Map.to_list() - |> Enum.reduce(points, fn {key, values}, finalists -> - finalists - |> Enum.filter(fn point -> point.meta[key] end) - |> Enum.filter(fn point -> point.meta[key] in values end) - end) + |> Map.to_list() + |> Enum.filter(fn {k, _v} -> + String.starts_with?(k, meta) + end) + |> Enum.map(fn {k, value} -> + clean_key = String.slice(k, meta_len..-1) + {clean_key, value} + end) + |> Enum.reduce(%{}, fn {key, value}, all -> + all_values = all[key] || [] + Map.merge(all, %{key => value ++ all_values}) + end) + |> Map.to_list() + |> Enum.reduce(points, fn {key, values}, finalists -> + finalists + |> Enum.filter(fn point -> point.meta[key] end) + |> Enum.filter(fn point -> point.meta[key] in values end) + end) end # Find all point IDs that are matched by a PointGroup @@ -89,20 +91,21 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do # since `meta` is a JSON column that must be # manually searched in memory. defp find_matching_point_ids(%PointGroup{} = pg) do - results = {pg, []} - |> stage_1("string_eq", @string_fields, "IN") - |> stage_1("number_eq", @numberic_fields, "IN") - |> stage_1("number_gt", @numberic_fields, ">") - |> stage_1("number_lt", @numberic_fields, "<") - |> stage_1_day_field() - |> unwrap_stage_1() - |> Enum.reduce(%{}, &stage_2/2) - |> Map.to_list() - |> Enum.reduce({[], [], 0}, &stage_3/2) - |> unwrap_stage_3() - |> finalize() - - results + results = + {pg, []} + |> stage_1("string_eq", @string_fields, "IN") + |> stage_1("number_eq", @numberic_fields, "IN") + |> stage_1("number_gt", @numberic_fields, ">") + |> stage_1("number_lt", @numberic_fields, "<") + |> stage_1_day_field() + |> unwrap_stage_1() + |> Enum.reduce(%{}, &stage_2/2) + |> Map.to_list() + |> Enum.reduce({[], [], 0}, &stage_3/2) + |> unwrap_stage_3() + |> finalize() + + results end # EDGE CASE: If the user _only_ wants to put static points @@ -116,7 +119,7 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do sql = "SELECT id FROM points WHERE #{x}" query_params = List.flatten(criteria) {:ok, query} = Repo.query(sql, query_params) - %Sqlite.DbConnection.Result{ rows: rows } = query + %{rows: rows} = query List.flatten(rows) end @@ -124,11 +127,13 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do defp unwrap_stage_3({query, args, _count}), do: {query, args} defp stage_1({pg, accum}, kind, fields, op) do - results = fields + results = + fields |> Enum.map(fn field -> {field, pg.criteria[kind][field]} end) |> Enum.filter(fn {_k, v} -> v end) |> Enum.map(fn {k, v} -> {k, op, v} end) - {pg, accum ++ results} + + {pg, accum ++ results} end defp stage_1_day_field({pg, accum}) do @@ -138,11 +143,16 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do time = Timex.shift(Timex.now(), days: -1 * days) if days == 0 do - { pg, accum } + {pg, accum} else - inverted_op = if op == ">" do "<" else ">" end - - { pg, accum ++ [{"created_at", inverted_op, time}] } + inverted_op = + if op == ">" do + "<" + else + ">" + end + + {pg, accum ++ [{"created_at", inverted_op, time}]} end end @@ -160,20 +170,23 @@ defmodule FarmbotCore.Asset.CriteriaRetriever do # Pretty sure there is an easier way to do this. # NOT OK: Repo.query("SELECT foo WHERE bar IN $0", [[1, 2, 3]]) # OK: Repo.query("SELECT foo WHERE bar IN ($0, $1, $2)", [1, 2, 3]) - defp stage_3({sql, args}, {full_query, full_args, count0}) when is_list(args) do + defp stage_3({sql, args}, {full_query, full_args, count0}) + when is_list(args) do arg_count = Enum.count(args) final = count0 + (arg_count - 1) initial_state = {sql, count0} + {next_sql, _} = if arg_count == 1 do {sql <> " ($#{count0})", nil} else Enum.reduce(args, initial_state, fn - (_, {sql, ^count0}) -> {sql <> " ($#{count0},", count0+1} - (_, {sql, ^final}) -> {sql <> " $#{final})", final} - (_, {sql, count}) -> {sql <> " $#{count},", count+1} + _, {sql, ^count0} -> {sql <> " ($#{count0},", count0 + 1} + _, {sql, ^final} -> {sql <> " $#{final})", final} + _, {sql, count} -> {sql <> " $#{count},", count + 1} end) end + {full_query ++ [next_sql], full_args ++ [args], final + 1} end diff --git a/farmbot_core/lib/farmbot_core/asset/device.ex b/lib/core/asset/device.ex similarity index 98% rename from farmbot_core/lib/farmbot_core/asset/device.ex rename to lib/core/asset/device.ex index 6cd37ff2a..88f5d5ae1 100644 --- a/farmbot_core/lib/farmbot_core/asset/device.ex +++ b/lib/core/asset/device.ex @@ -37,7 +37,7 @@ defmodule FarmbotCore.Asset.Device do mounted_tool_id: device.mounted_tool_id, indoor: device.indoor, lat: device.lat, - lng: device.lng, + lng: device.lng } end diff --git a/farmbot_core/lib/farmbot_core/asset/farm_event.ex b/lib/core/asset/farm_event.ex similarity index 83% rename from farmbot_core/lib/farmbot_core/asset/farm_event.ex rename to lib/core/asset/farm_event.ex index 4e7c1c213..f082dd063 100644 --- a/farmbot_core/lib/farmbot_core/asset/farm_event.ex +++ b/lib/core/asset/farm_event.ex @@ -1,5 +1,6 @@ defmodule FarmbotCore.Asset.FarmEvent do use FarmbotCore.Asset.Schema, path: "/api/farm_events" + alias FarmbotCore.Asset.FarmEvent.{ BodyNode, Execution, @@ -17,18 +18,19 @@ defmodule FarmbotCore.Asset.FarmEvent do has_many(:executions, Execution, on_delete: :delete_all, - on_replace: :delete) + on_replace: :delete + ) - field(:end_time, :utc_datetime) + field(:end_time, :utc_datetime_usec) field(:executable_type, :string) field(:executable_id, :id) field(:repeat, :integer) - field(:start_time, :utc_datetime) + field(:start_time, :utc_datetime_usec) field(:time_unit, :string) embeds_many(:body, BodyNode, on_replace: :delete) # Private - field(:last_executed, :utc_datetime) + field(:last_executed, :utc_datetime_usec) field(:monitor, :boolean, default: true) timestamps() @@ -66,9 +68,11 @@ defmodule FarmbotCore.Asset.FarmEvent do |> validate_required([]) end - def build_calendar(%__MODULE__{executable_type: "Regimen"} = fe, _), do: [fe.start_time] + def build_calendar(%__MODULE__{executable_type: "Regimen"} = fe, _), + do: [fe.start_time] - def build_calendar(%__MODULE__{time_unit: "never"} = fe, _), do: [fe.start_time] + def build_calendar(%__MODULE__{time_unit: "never"} = fe, _), + do: [fe.start_time] def build_calendar(%__MODULE__{} = fe, current_date_time) do current_time_seconds = DateTime.to_unix(current_date_time) @@ -77,11 +81,14 @@ defmodule FarmbotCore.Asset.FarmEvent do repeat = fe.repeat repeat_frequency_seconds = time_unit_to_seconds(fe.time_unit) - Calendar.new(current_time_seconds, - end_time_seconds, - repeat, - repeat_frequency_seconds, - start_time_seconds) + + Calendar.new( + current_time_seconds, + end_time_seconds, + repeat, + repeat_frequency_seconds, + start_time_seconds + ) |> Enum.map(&DateTime.from_unix!/1) end diff --git a/farmbot_core/lib/farmbot_core/asset/farm_event/body_node.ex b/lib/core/asset/farm_event/body_node.ex similarity index 92% rename from farmbot_core/lib/farmbot_core/asset/farm_event/body_node.ex rename to lib/core/asset/farm_event/body_node.ex index 1a7fe9558..a27041677 100644 --- a/farmbot_core/lib/farmbot_core/asset/farm_event/body_node.ex +++ b/lib/core/asset/farm_event/body_node.ex @@ -16,7 +16,7 @@ defmodule FarmbotCore.Asset.FarmEvent.BodyNode do end view body_node do - %{ kind: body_node.kind, args: body_node.args } + %{kind: body_node.kind, args: body_node.args} end def changeset(body_node, params \\ %{}) do diff --git a/farmbot_core/lib/farmbot_core/asset/farm_event/execution.ex b/lib/core/asset/farm_event/execution.ex similarity index 76% rename from farmbot_core/lib/farmbot_core/asset/farm_event/execution.ex rename to lib/core/asset/farm_event/execution.ex index 0abd6852d..53eef970f 100644 --- a/farmbot_core/lib/farmbot_core/asset/farm_event/execution.ex +++ b/lib/core/asset/farm_event/execution.ex @@ -3,16 +3,17 @@ defmodule FarmbotCore.Asset.FarmEvent.Execution do use Ecto.Schema import Ecto.Changeset @primary_key {:local_id, :binary_id, autogenerate: true} - @timestamps_opts inserted_at: :created_at, type: :utc_datetime + @timestamps_opts inserted_at: :created_at, type: :utc_datetime_usec schema "farm_event_executions" do - belongs_to(:farm_event, FarmEvent, - references: :local_id, + belongs_to(:farm_event, FarmEvent, + references: :local_id, type: :binary_id, foreign_key: :farm_event_local_id ) - field :scheduled_at, :utc_datetime - field :executed_at, :utc_datetime + + field :scheduled_at, :utc_datetime_usec + field :executed_at, :utc_datetime_usec field :status, :string timestamps() end @@ -21,4 +22,4 @@ defmodule FarmbotCore.Asset.FarmEvent.Execution do execution |> cast(params, [:executed_at, :scheduled_at, :status]) end -end \ No newline at end of file +end diff --git a/farmbot_core/lib/farmbot_core/asset/farmware_env.ex b/lib/core/asset/farmware_env.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/farmware_env.ex rename to lib/core/asset/farmware_env.ex diff --git a/farmbot_core/lib/farmbot_core/asset/farmware_installation.ex b/lib/core/asset/farmware_installation.ex similarity index 85% rename from farmbot_core/lib/farmbot_core/asset/farmware_installation.ex rename to lib/core/asset/farmware_installation.ex index 95e803a2c..24b64ebab 100644 --- a/farmbot_core/lib/farmbot_core/asset/farmware_installation.ex +++ b/lib/core/asset/farmware_installation.ex @@ -19,10 +19,7 @@ defmodule FarmbotCore.Asset.FarmwareInstallation do embeds_one(:manifest, Manifest, on_replace: :update) field(:monitor, :boolean, default: true) - field(:created_at, :utc_datetime, default: DateTime.utc_now()) - field(:updated_at, :utc_datetime, default: DateTime.utc_now()) - - # timestamps() + timestamps() end view farmware_installation do diff --git a/farmbot_core/lib/farmbot_core/asset/farmware_installation/manifest.ex b/lib/core/asset/farmware_installation/manifest.ex similarity index 86% rename from farmbot_core/lib/farmbot_core/asset/farmware_installation/manifest.ex rename to lib/core/asset/farmware_installation/manifest.ex index 1b87f289d..912848b52 100644 --- a/farmbot_core/lib/farmbot_core/asset/farmware_installation/manifest.ex +++ b/lib/core/asset/farmware_installation/manifest.ex @@ -35,9 +35,10 @@ defmodule FarmbotCore.Asset.FarmwareInstallation.Manifest do args: manifest.args, config: manifest.config, package_version: manifest.package_version, - farmware_tools_version_requirement: manifest.farmware_tools_version_requirement, + farmware_tools_version_requirement: + manifest.farmware_tools_version_requirement, farmware_manifest_version: manifest.farmware_manifest_version, - farmbot_os_version_requirement: manifest.farmbot_os_version_requirement, + farmbot_os_version_requirement: manifest.farmbot_os_version_requirement } end @@ -56,7 +57,7 @@ defmodule FarmbotCore.Asset.FarmwareInstallation.Manifest do :package_version, :farmware_tools_version_requirement, :farmware_manifest_version, - :farmbot_os_version_requirement, + :farmbot_os_version_requirement ]) |> validate_required([ :package, @@ -76,7 +77,9 @@ defmodule FarmbotCore.Asset.FarmwareInstallation.Manifest do |> validate_zip() end - defp validate_farmbot_os_version_requirement(%{valid?: false} = change), do: change + defp validate_farmbot_os_version_requirement(%{valid?: false} = change), + do: change + defp validate_farmbot_os_version_requirement(changeset) do req = get_field(changeset, :farmbot_os_version_requirement) cur = Project.version() @@ -93,26 +96,39 @@ defmodule FarmbotCore.Asset.FarmwareInstallation.Manifest do changeset _ -> - add_error(changeset, :farmbot_os_version_requirement, "Version requirement not met") + add_error( + changeset, + :farmbot_os_version_requirement, + "Version requirement not met" + ) end end defp validate_farmware_manifest_version(%{valid?: false} = change), do: change + defp validate_farmware_manifest_version(changeset) do manifest_version = get_field(changeset, :farmware_manifest_version) + case Version.compare(@acceptable_manifest_version, manifest_version) do :eq -> changeset _ -> - add_error(changeset, :farmware_manifest_version, "Version requirement not met") + add_error( + changeset, + :farmware_manifest_version, + "Version requirement not met" + ) end end # Validates the version of farmware_tools required - defp validate_farmware_tools_version_requirement(%{valid?: false} = change), do: change + defp validate_farmware_tools_version_requirement(%{valid?: false} = change), + do: change + defp validate_farmware_tools_version_requirement(changeset) do req = get_field(changeset, :farmware_tools_version_requirement) + match = try do Version.match?(@acceptable_farmware_tools_version_requirement, req) @@ -125,24 +141,34 @@ defmodule FarmbotCore.Asset.FarmwareInstallation.Manifest do changeset _ -> - add_error(changeset, :farmware_tools_version_requirement, "Version requirement not met") + add_error( + changeset, + :farmware_tools_version_requirement, + "Version requirement not met" + ) end end defp validate_package_version(%{valid?: false} = change), do: change + defp validate_package_version(changeset) do version = get_field(changeset, :package_version) + case Version.parse(version) do - {:ok, _} -> changeset + {:ok, _} -> + changeset + :error -> add_error(changeset, :package_version, "not a valid semver string") end end defp validate_url(%{valid?: false} = change), do: change + defp validate_url(changeset) do # `url` is optional url = get_field(changeset, :url) + if url do parse_uri(url, changeset, :url) else @@ -151,6 +177,7 @@ defmodule FarmbotCore.Asset.FarmwareInstallation.Manifest do end defp validate_zip(%{valid?: false} = change), do: change + defp validate_zip(changeset) do zip = get_field(changeset, :zip) parse_uri(zip, changeset, :zip) diff --git a/farmbot_core/lib/farmbot_core/asset/fbos_config.ex b/lib/core/asset/fbos_config.ex similarity index 96% rename from farmbot_core/lib/farmbot_core/asset/fbos_config.ex rename to lib/core/asset/fbos_config.ex index 5dd5d7efd..80e1e0fe4 100644 --- a/farmbot_core/lib/farmbot_core/asset/fbos_config.ex +++ b/lib/core/asset/fbos_config.ex @@ -49,7 +49,7 @@ defmodule FarmbotCore.Asset.FbosConfig do sequence_complete_log: fbos_config.sequence_complete_log, sequence_init_log: fbos_config.sequence_init_log, safe_height: fbos_config.safe_height, - soil_height: fbos_config.soil_height, + soil_height: fbos_config.soil_height } end @@ -68,7 +68,7 @@ defmodule FarmbotCore.Asset.FbosConfig do :sequence_body_log, :sequence_complete_log, :sequence_init_log, - :soil_height, + :soil_height ]) |> validate_required([]) end diff --git a/farmbot_core/lib/farmbot_core/asset/firmware_config.ex b/lib/core/asset/firmware_config.ex similarity index 91% rename from farmbot_core/lib/farmbot_core/asset/firmware_config.ex rename to lib/core/asset/firmware_config.ex index 515195124..b27dc10f3 100644 --- a/farmbot_core/lib/farmbot_core/asset/firmware_config.ex +++ b/lib/core/asset/firmware_config.ex @@ -138,9 +138,12 @@ defmodule FarmbotCore.Asset.FirmwareConfig do encoder_invert_x: firmware_config.encoder_invert_x, encoder_invert_y: firmware_config.encoder_invert_y, encoder_invert_z: firmware_config.encoder_invert_z, - encoder_missed_steps_decay_x: firmware_config.encoder_missed_steps_decay_x, - encoder_missed_steps_decay_y: firmware_config.encoder_missed_steps_decay_y, - encoder_missed_steps_decay_z: firmware_config.encoder_missed_steps_decay_z, + encoder_missed_steps_decay_x: + firmware_config.encoder_missed_steps_decay_x, + encoder_missed_steps_decay_y: + firmware_config.encoder_missed_steps_decay_y, + encoder_missed_steps_decay_z: + firmware_config.encoder_missed_steps_decay_z, encoder_missed_steps_max_x: firmware_config.encoder_missed_steps_max_x, encoder_missed_steps_max_y: firmware_config.encoder_missed_steps_max_y, encoder_missed_steps_max_z: firmware_config.encoder_missed_steps_max_z, @@ -159,12 +162,18 @@ defmodule FarmbotCore.Asset.FirmwareConfig do movement_axis_stealth_x: firmware_config.movement_axis_stealth_x, movement_axis_stealth_y: firmware_config.movement_axis_stealth_y, movement_axis_stealth_z: firmware_config.movement_axis_stealth_z, - movement_calibration_deadzone_x: firmware_config.movement_calibration_deadzone_x, - movement_calibration_deadzone_y: firmware_config.movement_calibration_deadzone_y, - movement_calibration_deadzone_z: firmware_config.movement_calibration_deadzone_z, - movement_calibration_retry_x: firmware_config.movement_calibration_retry_x, - movement_calibration_retry_y: firmware_config.movement_calibration_retry_y, - movement_calibration_retry_z: firmware_config.movement_calibration_retry_z, + movement_calibration_deadzone_x: + firmware_config.movement_calibration_deadzone_x, + movement_calibration_deadzone_y: + firmware_config.movement_calibration_deadzone_y, + movement_calibration_deadzone_z: + firmware_config.movement_calibration_deadzone_z, + movement_calibration_retry_x: + firmware_config.movement_calibration_retry_x, + movement_calibration_retry_y: + firmware_config.movement_calibration_retry_y, + movement_calibration_retry_z: + firmware_config.movement_calibration_retry_z, movement_enable_endpoints_x: firmware_config.movement_enable_endpoints_x, movement_enable_endpoints_y: firmware_config.movement_enable_endpoints_y, movement_enable_endpoints_z: firmware_config.movement_enable_endpoints_z, @@ -177,9 +186,12 @@ defmodule FarmbotCore.Asset.FirmwareConfig do movement_home_up_x: firmware_config.movement_home_up_x, movement_home_up_y: firmware_config.movement_home_up_y, movement_home_up_z: firmware_config.movement_home_up_z, - movement_invert_2_endpoints_x: firmware_config.movement_invert_2_endpoints_x, - movement_invert_2_endpoints_y: firmware_config.movement_invert_2_endpoints_y, - movement_invert_2_endpoints_z: firmware_config.movement_invert_2_endpoints_z, + movement_invert_2_endpoints_x: + firmware_config.movement_invert_2_endpoints_x, + movement_invert_2_endpoints_y: + firmware_config.movement_invert_2_endpoints_y, + movement_invert_2_endpoints_z: + firmware_config.movement_invert_2_endpoints_z, movement_invert_endpoints_x: firmware_config.movement_invert_endpoints_x, movement_invert_endpoints_y: firmware_config.movement_invert_endpoints_y, movement_invert_endpoints_z: firmware_config.movement_invert_endpoints_z, @@ -203,11 +215,15 @@ defmodule FarmbotCore.Asset.FirmwareConfig do movement_motor_current_x: firmware_config.movement_motor_current_x, movement_motor_current_y: firmware_config.movement_motor_current_y, movement_motor_current_z: firmware_config.movement_motor_current_z, - movement_secondary_motor_invert_x: firmware_config.movement_secondary_motor_invert_x, + movement_secondary_motor_invert_x: + firmware_config.movement_secondary_motor_invert_x, movement_secondary_motor_x: firmware_config.movement_secondary_motor_x, - movement_stall_sensitivity_x: firmware_config.movement_stall_sensitivity_x, - movement_stall_sensitivity_y: firmware_config.movement_stall_sensitivity_y, - movement_stall_sensitivity_z: firmware_config.movement_stall_sensitivity_z, + movement_stall_sensitivity_x: + firmware_config.movement_stall_sensitivity_x, + movement_stall_sensitivity_y: + firmware_config.movement_stall_sensitivity_y, + movement_stall_sensitivity_z: + firmware_config.movement_stall_sensitivity_z, movement_step_per_mm_x: firmware_config.movement_step_per_mm_x, movement_step_per_mm_y: firmware_config.movement_step_per_mm_y, movement_step_per_mm_z: firmware_config.movement_step_per_mm_z, @@ -240,7 +256,7 @@ defmodule FarmbotCore.Asset.FirmwareConfig do pin_guard_4_time_out: firmware_config.pin_guard_4_time_out, pin_guard_5_active_state: firmware_config.pin_guard_5_active_state, pin_guard_5_pin_nr: firmware_config.pin_guard_5_pin_nr, - pin_guard_5_time_out: firmware_config.pin_guard_5_time_out, + pin_guard_5_time_out: firmware_config.pin_guard_5_time_out } end diff --git a/farmbot_core/lib/farmbot_core/asset/first_party_farmware.ex b/lib/core/asset/first_party_farmware.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/first_party_farmware.ex rename to lib/core/asset/first_party_farmware.ex diff --git a/farmbot_core/lib/farmbot_core/asset/peripheral.ex b/lib/core/asset/peripheral.ex similarity index 88% rename from farmbot_core/lib/farmbot_core/asset/peripheral.ex rename to lib/core/asset/peripheral.ex index c7a99cb26..a4873e68e 100644 --- a/farmbot_core/lib/farmbot_core/asset/peripheral.ex +++ b/lib/core/asset/peripheral.ex @@ -32,7 +32,15 @@ defmodule FarmbotCore.Asset.Peripheral do def changeset(peripheral, params \\ %{}) do peripheral - |> cast(params, [:id, :pin, :mode, :label, :monitor, :created_at, :updated_at]) + |> cast(params, [ + :id, + :pin, + :mode, + :label, + :monitor, + :created_at, + :updated_at + ]) |> validate_required([]) end diff --git a/farmbot_core/lib/farmbot_core/asset/pin_binding.ex b/lib/core/asset/pin_binding.ex similarity index 77% rename from farmbot_core/lib/farmbot_core/asset/pin_binding.ex rename to lib/core/asset/pin_binding.ex index a655c3df8..8d331a357 100644 --- a/farmbot_core/lib/farmbot_core/asset/pin_binding.ex +++ b/lib/core/asset/pin_binding.ex @@ -46,7 +46,17 @@ defmodule FarmbotCore.Asset.PinBinding do end def validate_pin_num(changeset) do - if get_field(changeset, :pin_num, -1) in [17, 23, 27, 06, 21, 24, 25, 12, 13] do + if get_field(changeset, :pin_num, -1) in [ + 17, + 23, + 27, + 06, + 21, + 24, + 25, + 12, + 13 + ] do add_error(changeset, :pin_num, "in use") else changeset @@ -55,7 +65,10 @@ defmodule FarmbotCore.Asset.PinBinding do end defimpl String.Chars, for: FarmbotCore.Asset.PinBinding do - def to_string(%FarmbotCore.Asset.PinBinding{special_action: action, pin_num: 16}) do + def to_string(%FarmbotCore.Asset.PinBinding{ + special_action: action, + pin_num: 16 + }) do special_action(1, action, 16) end @@ -63,7 +76,10 @@ defimpl String.Chars, for: FarmbotCore.Asset.PinBinding do "Button 1: (Pi 16)" end - def to_string(%FarmbotCore.Asset.PinBinding{special_action: action, pin_num: 22}) do + def to_string(%FarmbotCore.Asset.PinBinding{ + special_action: action, + pin_num: 22 + }) do special_action(2, action, 22) end @@ -71,7 +87,10 @@ defimpl String.Chars, for: FarmbotCore.Asset.PinBinding do "Button 2: (Pi 22)" end - def to_string(%FarmbotCore.Asset.PinBinding{special_action: action, pin_num: 26}) do + def to_string(%FarmbotCore.Asset.PinBinding{ + special_action: action, + pin_num: 26 + }) do special_action(3, action, 26) end @@ -79,7 +98,10 @@ defimpl String.Chars, for: FarmbotCore.Asset.PinBinding do "Button 3: (Pi 26)" end - def to_string(%FarmbotCore.Asset.PinBinding{special_action: action, pin_num: 5}) do + def to_string(%FarmbotCore.Asset.PinBinding{ + special_action: action, + pin_num: 5 + }) do special_action(4, action, 5) end @@ -87,7 +109,10 @@ defimpl String.Chars, for: FarmbotCore.Asset.PinBinding do "Button 4: (Pi 5)" end - def to_string(%FarmbotCore.Asset.PinBinding{special_action: action, pin_num: 20}) do + def to_string(%FarmbotCore.Asset.PinBinding{ + special_action: action, + pin_num: 20 + }) do special_action(5, action, 20) end diff --git a/farmbot_core/lib/farmbot_core/asset/point.ex b/lib/core/asset/point.ex similarity index 94% rename from farmbot_core/lib/farmbot_core/asset/point.ex rename to lib/core/asset/point.ex index 4903a80a6..04d15ccd9 100644 --- a/farmbot_core/lib/farmbot_core/asset/point.ex +++ b/lib/core/asset/point.ex @@ -13,14 +13,14 @@ defmodule FarmbotCore.Asset.Point do foreign_key: :asset_local_id ) - field(:discarded_at, :utc_datetime) + field(:discarded_at, :utc_datetime_usec) field(:gantry_mounted, :boolean) field(:meta, :map) field(:monitor, :boolean, default: true) field(:name, :string) field(:openfarm_slug, :string) field(:plant_stage, :string) - field(:planted_at, :utc_datetime) + field(:planted_at, :utc_datetime_usec) field(:pointer_type, :string) field(:pullout_direction, :integer) field(:radius, :float) @@ -73,7 +73,7 @@ defmodule FarmbotCore.Asset.Point do :updated_at, :x, :y, - :z, + :z ]) |> validate_required([]) end diff --git a/farmbot_core/lib/farmbot_core/asset/point_group.ex b/lib/core/asset/point_group.ex similarity index 94% rename from farmbot_core/lib/farmbot_core/asset/point_group.ex rename to lib/core/asset/point_group.ex index 1314d4d3c..b7ba44e12 100644 --- a/farmbot_core/lib/farmbot_core/asset/point_group.ex +++ b/lib/core/asset/point_group.ex @@ -6,7 +6,7 @@ defmodule FarmbotCore.Asset.PointGroup do use FarmbotCore.Asset.Schema, path: "/api/point_groups" @default_criteria %{ - "day" => %{ "op" => ">", "days_ago" => 0 }, + "day" => %{"op" => ">", "days_ago" => 0}, # Map, "string_eq" => %{}, # Map, @@ -14,7 +14,7 @@ defmodule FarmbotCore.Asset.PointGroup do # Map, "number_lt" => %{}, # Map, - "number_gt" => %{}, + "number_gt" => %{} } schema "point_groups" do diff --git a/farmbot_core/lib/farmbot_core/asset/private.ex b/lib/core/asset/private.ex similarity index 72% rename from farmbot_core/lib/farmbot_core/asset/private.ex rename to lib/core/asset/private.ex index 20881fd20..092f76cd0 100644 --- a/farmbot_core/lib/farmbot_core/asset/private.ex +++ b/lib/core/asset/private.ex @@ -7,8 +7,8 @@ defmodule FarmbotCore.Asset.Private do require Logger require FarmbotCore.Logger - alias FarmbotCore.{Asset.Repo, Asset.Private.LocalMeta } - alias FarmbotCore.Asset.{ FbosConfig, FirmwareConfig } + alias FarmbotCore.{Asset.Repo, Asset.Private.LocalMeta} + alias FarmbotCore.Asset.{FbosConfig, FirmwareConfig} import Ecto.Query, warn: false import Ecto.Changeset, warn: false @@ -20,9 +20,13 @@ defmodule FarmbotCore.Asset.Private do def list_meta_status(status, module) do table = table(module) - q = from(lm in LocalMeta, - where: lm.table == ^table and lm.status == ^status, - select: lm.asset_local_id) + + q = + from(lm in LocalMeta, + where: lm.table == ^table and lm.status == ^status, + select: lm.asset_local_id + ) + Repo.all(from(data in module, join: lm in subquery(q))) end @@ -34,7 +38,12 @@ defmodule FarmbotCore.Asset.Private do @doc "Lists `module` objects that have a `local_meta` object" def any_stale?() do - q = from(lm in LocalMeta, where: lm.status == "stale", select: lm.asset_local_id) + q = + from(lm in LocalMeta, + where: lm.status == "stale", + select: lm.asset_local_id + ) + Repo.aggregate(q, :count, :id) != 0 end @@ -60,21 +69,24 @@ defmodule FarmbotCore.Asset.Private do end def recover_from_row_lock_failure() do - list_dirty(FbosConfig) - ++ list_dirty(FirmwareConfig) - ++ list_stale(FbosConfig) - ++ list_stale(FirmwareConfig) + (list_dirty(FbosConfig) ++ + list_dirty(FirmwareConfig) ++ + list_stale(FbosConfig) ++ + list_stale(FirmwareConfig)) |> Enum.map(&mark_clean!/1) end defp table(%module{}), do: table(module) defp table(module), do: module.__schema__(:source) + defp set_status!(asset, params, status) do table = table(asset) local_meta = Repo.one( - from(lm in LocalMeta, where: lm.asset_local_id == ^asset.local_id and lm.table == ^table) + from(lm in LocalMeta, + where: lm.asset_local_id == ^asset.local_id and lm.table == ^table + ) ) || Ecto.build_assoc(asset, :local_meta) ## NOTE(Connor): 19/11/13 @@ -85,44 +97,59 @@ defmodule FarmbotCore.Asset.Private do # caught both errors here as they are both essentially the same thing, and can be safely # discarded. Doing an `insert_or_update/1` (without the bang) can still result in the sqlite # error being thrown. - changeset = LocalMeta.changeset(local_meta, Map.merge(params, %{table: table, status: status})) + changeset = + LocalMeta.changeset( + local_meta, + Map.merge(params, %{table: table, status: status}) + ) + try do Repo.insert_or_update!(changeset) catch - :error, %Sqlite.DbConnection.Error{ - message: "UNIQUE constraint failed: local_metas.table, local_metas.asset_local_id", - sqlite: %{code: :constraint} + :error, + %{ + message: + "UNIQUE constraint failed: local_metas.table, local_metas.asset_local_id" } -> - Logger.warn """ + Logger.warn(""" Caught race condition marking data as dirty (sqlite) table: #{inspect(table)} id: #{inspect(asset.local_id)} - """ + """) + Ecto.Changeset.apply_changes(changeset) - :error, %Ecto.InvalidChangesetError{ + + :error, + %Ecto.InvalidChangesetError{ changeset: %{ action: :insert, errors: [ - table: {"LocalMeta already exists.", [ - validation: :unsafe_unique, - fields: [:table, :asset_local_id] - ]} - ]} - } -> - Logger.warn """ + table: + {"LocalMeta already exists.", + [ + validation: :unsafe_unique, + fields: [:table, :asset_local_id] + ]} + ] + } + } -> + Logger.warn(""" Caught race condition marking data as dirty (ecto) table: #{inspect(table)} id: #{inspect(asset.local_id)} - """ + """) + Ecto.Changeset.apply_changes(changeset) + type, reason -> - FarmbotCore.Logger.error 1, """ + FarmbotCore.Logger.error(1, """ Caught unexpected error marking data as dirty table: #{inspect(table)} id: #{inspect(asset.local_id)} error type: #{inspect(type)} reason: #{inspect(reason)} - """ + """) + Ecto.Changeset.apply_changes(changeset) end end diff --git a/farmbot_core/lib/farmbot_core/asset/private/local_meta.ex b/lib/core/asset/private/local_meta.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/private/local_meta.ex rename to lib/core/asset/private/local_meta.ex diff --git a/farmbot_core/lib/farmbot_core/asset/public_key.ex b/lib/core/asset/public_key.ex similarity index 92% rename from farmbot_core/lib/farmbot_core/asset/public_key.ex rename to lib/core/asset/public_key.ex index f1c8b516f..e420c5612 100644 --- a/farmbot_core/lib/farmbot_core/asset/public_key.ex +++ b/lib/core/asset/public_key.ex @@ -35,18 +35,28 @@ defmodule FarmbotCore.Asset.PublicKey do def changeset(public_key, params \\ %{}) do public_key - |> cast(params, [:id, :name, :public_key, :monitor, :created_at, :updated_at]) + |> cast(params, [ + :id, + :name, + :public_key, + :monitor, + :created_at, + :updated_at + ]) |> validate_required([:public_key]) |> validate_rsa() end def validate_rsa(%Changeset{valid?: true} = changeset) do public_key_bin = get_field(changeset, :public_key) + case :ssh_file.decode(public_key_bin, :auth_keys) do [{_, opts}] -> maybe_add_name(changeset, opts[:comment]) + [_ | _] -> add_error(changeset, :public_key, "should only contain 1 key") + _ -> add_error(changeset, :public_key, "could not decode public key") end diff --git a/farmbot_core/lib/farmbot_core/asset/regimen.ex b/lib/core/asset/regimen.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/regimen.ex rename to lib/core/asset/regimen.ex diff --git a/farmbot_core/lib/farmbot_core/asset/regimen/body_node.ex b/lib/core/asset/regimen/body_node.ex similarity index 86% rename from farmbot_core/lib/farmbot_core/asset/regimen/body_node.ex rename to lib/core/asset/regimen/body_node.ex index f973a67b4..487f13f40 100644 --- a/farmbot_core/lib/farmbot_core/asset/regimen/body_node.ex +++ b/lib/core/asset/regimen/body_node.ex @@ -17,14 +17,16 @@ defmodule FarmbotCore.Asset.Regimen.BodyNode do end view body_node do - %{ kind: body_node.kind, args: body_node.args } + %{kind: body_node.kind, args: body_node.args} end def changeset(body_node, params \\ %{}) do body_node |> cast(params, [:kind, :args]) |> validate_required([:kind, :args]) - |> validate_inclusion(:kind, - ~w(parameter_application parameter_declaration variable_declaration)) + |> validate_inclusion( + :kind, + ~w(parameter_application parameter_declaration variable_declaration) + ) end end diff --git a/lib/core/asset/regimen/item.ex b/lib/core/asset/regimen/item.ex new file mode 100644 index 000000000..d4cad33d5 --- /dev/null +++ b/lib/core/asset/regimen/item.ex @@ -0,0 +1,28 @@ +defmodule FarmbotCore.Asset.Regimen.Item do + use Ecto.Schema + + import Ecto.Changeset + import FarmbotCore.Asset.View, only: [view: 2] + + @primary_key false + @behaviour FarmbotCore.Asset.View + + view regimen_item do + %{ + time_offset: regimen_item.time_offset, + sequence_id: regimen_item.sequence_id + } + end + + embedded_schema do + field(:time_offset, :integer) + # Can't use real references here. + field(:sequence_id, :id) + end + + def changeset(item, params \\ %{}) do + item + |> cast(params, [:time_offset, :sequence_id]) + |> validate_required([]) + end +end diff --git a/farmbot_core/lib/farmbot_core/asset/regimen_instance.ex b/lib/core/asset/regimen_instance.ex similarity index 76% rename from farmbot_core/lib/farmbot_core/asset/regimen_instance.ex rename to lib/core/asset/regimen_instance.ex index 783a3f439..8947e608e 100644 --- a/farmbot_core/lib/farmbot_core/asset/regimen_instance.ex +++ b/lib/core/asset/regimen_instance.ex @@ -2,27 +2,32 @@ defmodule FarmbotCore.Asset.RegimenInstance do use Ecto.Schema import Ecto.Changeset @primary_key {:local_id, :binary_id, autogenerate: true} + # _usec @timestamps_opts inserted_at: :created_at, type: :utc_datetime alias FarmbotCore.Asset.{FarmEvent, Regimen, RegimenInstance.Execution} schema "regimen_instances" do - belongs_to(:regimen, Regimen, + belongs_to(:regimen, Regimen, type: :binary_id, references: :local_id, - on_replace: :delete + on_replace: :delete ) - belongs_to(:farm_event, FarmEvent, + + belongs_to(:farm_event, FarmEvent, type: :binary_id, references: :local_id, - on_replace: :delete + on_replace: :delete + ) + + has_many(:executions, Execution, + on_delete: :delete_all, + on_replace: :delete ) - has_many(:executions, Execution, - on_delete: :delete_all, - on_replace: :delete) - field(:epoch, :utc_datetime) - field(:started_at, :utc_datetime) - field(:next, :utc_datetime) + + field(:epoch, :utc_datetime_usec) + field(:started_at, :utc_datetime_usec) + field(:next, :utc_datetime_usec) # Can't use references here. field(:next_sequence_id, :id) field(:monitor, :boolean, default: true) @@ -31,7 +36,13 @@ defmodule FarmbotCore.Asset.RegimenInstance do def changeset(regimen_instance, params \\ %{}) do regimen_instance - |> cast(params, [:started_at, :next, :next_sequence_id, :monitor, :updated_at]) + |> cast(params, [ + :started_at, + :next, + :next_sequence_id, + :monitor, + :updated_at + ]) |> put_epoch() |> cast_assoc(:regimen) |> cast_assoc(:farm_event) @@ -57,6 +68,7 @@ defmodule FarmbotCore.Asset.RegimenInstance do def build_epoch(%DateTime{} = datetime) do case FarmbotCore.Asset.device().timezone do nil -> + IO.puts("===== WHY IS THIS NIL????") :error tz -> diff --git a/farmbot_core/lib/farmbot_core/asset/regimen_instance/execution.ex b/lib/core/asset/regimen_instance/execution.ex similarity index 75% rename from farmbot_core/lib/farmbot_core/asset/regimen_instance/execution.ex rename to lib/core/asset/regimen_instance/execution.ex index 2758a3388..bdd788c04 100644 --- a/farmbot_core/lib/farmbot_core/asset/regimen_instance/execution.ex +++ b/lib/core/asset/regimen_instance/execution.ex @@ -3,16 +3,17 @@ defmodule FarmbotCore.Asset.RegimenInstance.Execution do use Ecto.Schema import Ecto.Changeset @primary_key {:local_id, :binary_id, autogenerate: true} - @timestamps_opts inserted_at: :created_at, type: :utc_datetime + @timestamps_opts inserted_at: :created_at, type: :utc_datetime_usec schema "regimen_instance_executions" do - belongs_to(:regimen_instance, RegimenInstance, - references: :local_id, + belongs_to(:regimen_instance, RegimenInstance, + references: :local_id, type: :binary_id, foreign_key: :regimen_instance_local_id ) - field :scheduled_at, :utc_datetime - field :executed_at, :utc_datetime + + field :scheduled_at, :utc_datetime_usec + field :executed_at, :utc_datetime_usec field :status, :string timestamps() end @@ -21,4 +22,4 @@ defmodule FarmbotCore.Asset.RegimenInstance.Execution do execution |> cast(params, [:executed_at, :scheduled_at, :status]) end -end \ No newline at end of file +end diff --git a/farmbot_core/lib/farmbot_core/asset/repo.ex b/lib/core/asset/repo.ex similarity index 55% rename from farmbot_core/lib/farmbot_core/asset/repo.ex rename to lib/core/asset/repo.ex index c02ff9895..cd59f0d14 100644 --- a/farmbot_core/lib/farmbot_core/asset/repo.ex +++ b/lib/core/asset/repo.ex @@ -1,4 +1,4 @@ defmodule FarmbotCore.Asset.Repo do @moduledoc "Repo for storing Asset data." - use Ecto.Repo, otp_app: :farmbot_core + use Ecto.Repo, otp_app: :farmbot, adapter: Ecto.Adapters.SQLite3 end diff --git a/farmbot_core/lib/farmbot_core/asset/schema.ex b/lib/core/asset/schema.ex similarity index 98% rename from farmbot_core/lib/farmbot_core/asset/schema.ex rename to lib/core/asset/schema.ex index d59799227..ddae02cb8 100644 --- a/farmbot_core/lib/farmbot_core/asset/schema.ex +++ b/lib/core/asset/schema.ex @@ -17,7 +17,7 @@ defmodule FarmbotCore.Asset.Schema do @doc "Path on the Farmbot Web API" def path, do: Keyword.fetch!(unquote(opts), :path) @primary_key {:local_id, :binary_id, autogenerate: true} - @timestamps_opts inserted_at: :created_at, type: :utc_datetime + @timestamps_opts inserted_at: :created_at, type: :utc_datetime_usec end end diff --git a/farmbot_core/lib/farmbot_core/asset/sensor.ex b/lib/core/asset/sensor.ex similarity index 87% rename from farmbot_core/lib/farmbot_core/asset/sensor.ex rename to lib/core/asset/sensor.ex index 0ca04275d..e2e6fbc2e 100644 --- a/farmbot_core/lib/farmbot_core/asset/sensor.ex +++ b/lib/core/asset/sensor.ex @@ -32,7 +32,15 @@ defmodule FarmbotCore.Asset.Sensor do def changeset(sensor, params \\ %{}) do sensor - |> cast(params, [:id, :pin, :mode, :label, :monitor, :created_at, :updated_at]) + |> cast(params, [ + :id, + :pin, + :mode, + :label, + :monitor, + :created_at, + :updated_at + ]) |> validate_required([:id, :pin, :mode, :label]) end diff --git a/farmbot_core/lib/farmbot_core/asset/sensor_reading.ex b/lib/core/asset/sensor_reading.ex similarity index 86% rename from farmbot_core/lib/farmbot_core/asset/sensor_reading.ex rename to lib/core/asset/sensor_reading.ex index fe8544bfa..9c9658300 100644 --- a/farmbot_core/lib/farmbot_core/asset/sensor_reading.ex +++ b/lib/core/asset/sensor_reading.ex @@ -39,7 +39,18 @@ defmodule FarmbotCore.Asset.SensorReading do def changeset(sensor, params \\ %{}) do sensor - |> cast(params, [:id, :mode, :pin, :value, :x, :y, :z, :monitor, :created_at, :updated_at]) + |> cast(params, [ + :id, + :mode, + :pin, + :value, + :x, + :y, + :z, + :monitor, + :created_at, + :updated_at + ]) |> validate_required([]) end end diff --git a/farmbot_core/lib/farmbot_core/asset/sequence.ex b/lib/core/asset/sequence.ex similarity index 84% rename from farmbot_core/lib/farmbot_core/asset/sequence.ex rename to lib/core/asset/sequence.ex index 025b9e01c..10cb87306 100644 --- a/farmbot_core/lib/farmbot_core/asset/sequence.ex +++ b/lib/core/asset/sequence.ex @@ -34,7 +34,16 @@ defmodule FarmbotCore.Asset.Sequence do def changeset(device, params \\ %{}) do device - |> cast(params, [:id, :args, :name, :kind, :body, :monitor, :created_at, :updated_at]) + |> cast(params, [ + :id, + :args, + :name, + :kind, + :body, + :monitor, + :created_at, + :updated_at + ]) |> validate_required([]) end end diff --git a/farmbot_core/lib/farmbot_core/asset/storage_auth.ex b/lib/core/asset/storage_auth.ex similarity index 89% rename from farmbot_core/lib/farmbot_core/asset/storage_auth.ex rename to lib/core/asset/storage_auth.ex index 27ed7873d..bb28e597e 100644 --- a/farmbot_core/lib/farmbot_core/asset/storage_auth.ex +++ b/lib/core/asset/storage_auth.ex @@ -19,7 +19,15 @@ defmodule FarmbotCore.Asset.StorageAuth do def changeset(form_data, params \\ %{}) do form_data - |> cast(params, [:key, :acl, :policy, :signature, :file, :"Content-Type", :GoogleAccessId]) + |> cast(params, [ + :key, + :acl, + :policy, + :signature, + :file, + :"Content-Type", + :GoogleAccessId + ]) |> validate_required([ :key, :acl, @@ -51,7 +59,7 @@ defmodule FarmbotCore.Asset.StorageAuth do file: storage_auth.form_data.file, "Content-Type": storage_auth.form_data."Content-Type", GoogleAccessId: storage_auth.form_data."GoogleAccessId" - }, + } } end diff --git a/lib/core/asset/supervisor.ex b/lib/core/asset/supervisor.ex new file mode 100644 index 000000000..605247662 --- /dev/null +++ b/lib/core/asset/supervisor.ex @@ -0,0 +1,44 @@ +defmodule FarmbotCore.Asset.Supervisor do + @moduledoc false + use Supervisor + alias FarmbotCore.{ChangeSupervisor, AssetMonitor} + + alias FarmbotCore.Asset.{ + Device, + FarmEvent, + FarmwareEnv, + FarmwareInstallation, + FirstPartyFarmware, + FbosConfig, + FirmwareConfig, + PinBinding, + PublicKey, + Peripheral, + RegimenInstance + } + + def start_link(args) do + Supervisor.start_link(__MODULE__, args, name: __MODULE__) + end + + def init([]) do + FarmbotOS.LegacyMigrator.run() + Supervisor.init(children(), strategy: :one_for_one) + end + + def children, + do: [ + {ChangeSupervisor, module: FbosConfig}, + {ChangeSupervisor, module: FirmwareConfig}, + {ChangeSupervisor, module: Device}, + {ChangeSupervisor, module: RegimenInstance}, + {ChangeSupervisor, module: FarmEvent}, + {ChangeSupervisor, module: PinBinding}, + {ChangeSupervisor, module: PublicKey}, + {ChangeSupervisor, module: Peripheral}, + {ChangeSupervisor, module: FirstPartyFarmware}, + {ChangeSupervisor, module: FarmwareInstallation}, + {ChangeSupervisor, module: FarmwareEnv}, + AssetMonitor + ] +end diff --git a/farmbot_core/lib/farmbot_core/asset/sync.ex b/lib/core/asset/sync.ex similarity index 92% rename from farmbot_core/lib/farmbot_core/asset/sync.ex rename to lib/core/asset/sync.ex index 20f1bf7f7..587a77a26 100644 --- a/farmbot_core/lib/farmbot_core/asset/sync.ex +++ b/lib/core/asset/sync.ex @@ -21,7 +21,7 @@ defmodule FarmbotCore.Asset.Sync do embedded_schema do field(:id, :id) - field(:updated_at, :utc_datetime) + field(:updated_at, :utc_datetime_usec) end def changeset(item, params \\ %{}) @@ -55,7 +55,7 @@ defmodule FarmbotCore.Asset.Sync do embeds_many(:sensors, Item) embeds_many(:sequences, Item) embeds_many(:tools, Item) - field(:now, :utc_datetime) + field(:now, :utc_datetime_usec) timestamps() end @@ -66,8 +66,10 @@ defmodule FarmbotCore.Asset.Sync do firmware_configs: Enum.map(sync.firmware_configs, &Item.render/1), farm_events: Enum.map(sync.farm_events, &Item.render/1), farmware_envs: Enum.map(sync.farmware_envs, &Item.render/1), - first_party_farmwares: Enum.map(sync.first_party_farmwares, &Item.render/1), - farmware_installations: Enum.map(sync.farmware_installations, &Item.render/1), + first_party_farmwares: + Enum.map(sync.first_party_farmwares, &Item.render/1), + farmware_installations: + Enum.map(sync.farmware_installations, &Item.render/1), peripherals: Enum.map(sync.peripherals, &Item.render/1), pin_bindings: Enum.map(sync.pin_bindings, &Item.render/1), points: Enum.map(sync.points, &Item.render/1), diff --git a/farmbot_core/lib/farmbot_core/asset/tool.ex b/lib/core/asset/tool.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/tool.ex rename to lib/core/asset/tool.ex diff --git a/farmbot_core/lib/farmbot_core/asset/view.ex b/lib/core/asset/view.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset/view.ex rename to lib/core/asset/view.ex diff --git a/farmbot_core/lib/farmbot_core/asset_monitor.ex b/lib/core/asset_monitor.ex similarity index 84% rename from farmbot_core/lib/farmbot_core/asset_monitor.ex rename to lib/core/asset_monitor.ex index 9f9daaf47..6e6abc5ae 100644 --- a/farmbot_core/lib/farmbot_core/asset_monitor.ex +++ b/lib/core/asset_monitor.ex @@ -22,7 +22,7 @@ defmodule FarmbotCore.AssetMonitor do PublicKey } - alias FarmbotCore.{AssetSupervisor, AssetWorker} + alias FarmbotCore.{ChangeSupervisor, AssetWorker} require Logger @@ -47,7 +47,12 @@ defmodule FarmbotCore.AssetMonitor do end def handle_call(:force_checkup, caller, state) do - state = %{state | force_callers: state.force_callers ++ [caller], order: order()} + state = %{ + state + | force_callers: state.force_callers ++ [caller], + order: order() + } + {:noreply, state, 0} end @@ -78,10 +83,11 @@ defmodule FarmbotCore.AssetMonitor do sub_state = Map.drop(sub_state, deleted_ids) Enum.each(deleted_ids, fn local_id -> - AssetSupervisor.terminate_child(kind, local_id) + ChangeSupervisor.terminate_child(kind, local_id) end) - Enum.reduce(expected, sub_state, fn %{local_id: id, updated_at: updated_at} = asset, + Enum.reduce(expected, sub_state, fn %{local_id: id, updated_at: updated_at} = + asset, sub_state -> cond do asset.monitor == false -> @@ -89,12 +95,12 @@ defmodule FarmbotCore.AssetMonitor do is_nil(sub_state[id]) -> asset = Repo.preload(asset, AssetWorker.preload(asset)) - :ok = AssetSupervisor.start_child(asset) |> assert_result!(asset) + :ok = ChangeSupervisor.start_child(asset) |> assert_result!(asset) Map.put(sub_state, id, updated_at) compare_datetimes(updated_at, sub_state[id]) == :gt -> asset = Repo.preload(asset, AssetWorker.preload(asset)) - :ok = AssetSupervisor.update_child(asset) |> assert_result!(asset) + :ok = ChangeSupervisor.update_child(asset) |> assert_result!(asset) Map.put(sub_state, id, updated_at) true -> @@ -106,8 +112,12 @@ defmodule FarmbotCore.AssetMonitor do defp assert_result!(:ignore, _), do: :ok defp assert_result!({:ok, _}, _), do: :ok defp assert_result!({:error, {:already_started, _pid}}, _), do: :ok + defp assert_result!(result, asset), - do: exit("Failed to start or update child: #{inspect(asset)} #{inspect(result)}") + do: + exit( + "Failed to start or update child: #{inspect(asset)} #{inspect(result)}" + ) def order, do: [ diff --git a/farmbot_core/lib/farmbot_core/asset_worker.ex b/lib/core/asset_worker.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset_worker.ex rename to lib/core/asset_worker.ex diff --git a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex b/lib/core/asset_workers/device_worker.ex similarity index 79% rename from farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex rename to lib/core/asset_workers/device_worker.ex index 1674d0b16..a9dac028c 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex +++ b/lib/core/asset_workers/device_worker.ex @@ -52,16 +52,27 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Device do :mounted_tool_id ] - new_interesting_device = Map.take(new_device, interesting_params) |> MapSet.new() - old_interesting_device = Map.take(old_device, interesting_params) |> MapSet.new() - difference = MapSet.difference(new_interesting_device, old_interesting_device) + new_interesting_device = + Map.take(new_device, interesting_params) |> MapSet.new() + + old_interesting_device = + Map.take(old_device, interesting_params) |> MapSet.new() + + difference = + MapSet.difference(new_interesting_device, old_interesting_device) Enum.each(difference, fn {:ota_hour, nil} -> - FarmbotCore.Logger.success(1, "Farmbot will apply updates as soon as possible") + FarmbotCore.Logger.success( + 1, + "Farmbot will apply updates as soon as possible" + ) {:ota_hour, hour} -> - FarmbotCore.Logger.success(1, "Farmbot will apply updates during the hour of #{hour}:00") + FarmbotCore.Logger.success( + 1, + "Farmbot will apply updates during the hour of #{hour}:00" + ) {:mounted_tool_id, nil} -> if old_device.mounted_tool_id do diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker.ex b/lib/core/asset_workers/farm_event_worker.ex similarity index 99% rename from farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker.ex rename to lib/core/asset_workers/farm_event_worker.ex index 7c63a8b83..97befd203 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker.ex +++ b/lib/core/asset_workers/farm_event_worker.ex @@ -2,6 +2,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmEvent do require Logger alias FarmbotCore.Asset.FarmEvent + alias FarmbotCore.FarmEventWorker.{ RegimenEvent, SequenceEvent diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/regimen_event.ex b/lib/core/asset_workers/farm_event_worker/regimen_event.ex similarity index 59% rename from farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/regimen_event.ex rename to lib/core/asset_workers/farm_event_worker/regimen_event.ex index 22c6e42e9..970e6ce69 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/regimen_event.ex +++ b/lib/core/asset_workers/farm_event_worker/regimen_event.ex @@ -9,13 +9,13 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEvent do @impl GenServer def init([event, args]) do - send self(), :checkup + send(self(), :checkup) {:ok, %{event: event, args: args}} end @impl GenServer def handle_info(:checkup, state) do - send self(), {:checkup, DateTime.utc_now()} + send(self(), {:checkup, DateTime.utc_now()}) {:noreply, state} end @@ -25,23 +25,39 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEvent do should_be_running? = DateTime.compare(start_time, now) == :lt if should_be_running? do - Logger.debug "Ensuring RegimenInstance exists for event: #{inspect(state.event)}" - send self(), {:ensure_started} + Logger.debug( + "Ensuring RegimenInstance exists for event: #{inspect(state.event)}" + ) + + send(self(), {:ensure_started}) {:noreply, state} else - send self(), {:ensure_not_started} - Process.send_after(self(), :checkup, state.args[:checkup_time_ms] || 15_000) + send(self(), {:ensure_not_started}) + + Process.send_after( + self(), + :checkup, + state.args[:checkup_time_ms] || 15_000 + ) + {:noreply, state} end end def handle_info({:ensure_started}, state) do if Asset.get_regimen_instance(state.event) do - send self(), {:ensure_unchanged} + send(self(), {:ensure_unchanged}) {:noreply, state} else - Logger.debug "Creating RegimenInstance for event: #{inspect(state.event)}" - _regimen_instance = Asset.new_regimen_instance!(state.event, %{started_at: state.event.start_time}) + Logger.debug( + "Creating RegimenInstance for event: #{inspect(state.event)}" + ) + + _regimen_instance = + Asset.new_regimen_instance!(state.event, %{ + started_at: state.event.start_time + }) + {:noreply, state, :hibernate} end end @@ -50,7 +66,10 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEvent do regimen_instance = Asset.get_regimen_instance(state.event) if regimen_instance do - Logger.debug "RegimenInstance shouldn't exist for event: #{inspect(state.event)} Removing." + Logger.debug( + "RegimenInstance shouldn't exist for event: #{inspect(state.event)} Removing." + ) + Asset.delete_regimen_instance!(regimen_instance) {:noreply, state, :hibernate} else @@ -62,15 +81,19 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEvent do regimen_instance = Asset.get_regimen_instance(state.event) start_time = state.event.start_time - start_times_ok? = Map.equal?( - Map.take(regimen_instance.started_at, [:year, :month, :day]), - Map.take(start_time, [:year, :month, :day]) - ) + start_times_ok? = + Map.equal?( + Map.take(regimen_instance.started_at, [:year, :month, :day]), + Map.take(start_time, [:year, :month, :day]) + ) if start_times_ok? do {:noreply, state, :hibernate} else - Logger.debug "RegimenInstance start time changed for event: #{inspect(state.event)} Recreating." + Logger.debug( + "RegimenInstance start time changed for event: #{inspect(state.event)} Recreating." + ) + Asset.delete_regimen_instance!(regimen_instance) Asset.new_regimen_instance!(state.event, %{started_at: start_time}) {:noreply, state, :hibernate} diff --git a/lib/core/asset_workers/farm_event_worker/sequence_event.ex b/lib/core/asset_workers/farm_event_worker/sequence_event.ex new file mode 100644 index 000000000..463f34e90 --- /dev/null +++ b/lib/core/asset_workers/farm_event_worker/sequence_event.ex @@ -0,0 +1,92 @@ +defmodule FarmbotCore.FarmEventWorker.SequenceEvent do + require Logger + require FarmbotCore.Logger + alias FarmbotCore.Celery.AST + + alias FarmbotCore.{ + Asset, + Asset.FarmEvent + } + + use GenServer + + @impl GenServer + def init([farm_event, args]) do + send(self(), :schedule) + + {:ok, + %{farm_event: farm_event, args: args, scheduled: 0, timesync_waits: 0}} + end + + @impl GenServer + def handle_info(:schedule, state) do + farm_event = state.farm_event + + occurrences = + farm_event + |> FarmEvent.build_calendar(DateTime.utc_now()) + # get rid of any item that has already been scheduled/executed + |> Enum.reject(fn scheduled_at -> + Asset.get_farm_event_execution(farm_event, scheduled_at) + end) + + occurrences + |> Enum.each(fn at -> + schedule_sequence(farm_event, at) + end) + + {:noreply, %{state | scheduled: state.scheduled + length(occurrences)}} + end + + def handle_info(:timeout, state) do + Process.send_after(self(), :schedule, 1_000) + {:noreply, state} + end + + def handle_info( + {FarmbotCore.Celery, + {:scheduled_execution, scheduled_at, executed_at, result}}, + state + ) do + status = + case result do + :ok -> + "ok" + + {:error, reason} -> + FarmbotCore.Logger.error( + 2, + "Event scheduled at #{scheduled_at} failed to execute: #{reason}" + ) + + reason + end + + _ = + Asset.add_execution_to_farm_event!(state.farm_event, %{ + scheduled_at: scheduled_at, + executed_at: executed_at, + status: status + }) + + {:noreply, state} + end + + def schedule_sequence(farm_event, at) do + sequence = Asset.get_sequence(farm_event.executable_id) + sequence || raise("Sequence #{farm_event.executable_id} is not synced") + param_appls = AST.decode(farm_event.body) + celery_ast = AST.decode(sequence) + + celery_args = + celery_ast.args + |> Map.put(:sequence_name, sequence.name) + |> Map.put(:locals, %{ + celery_ast.args.locals + | body: celery_ast.args.locals.body ++ param_appls + }) + + celery_ast = %{celery_ast | args: celery_args} + FarmbotCore.Celery.schedule(celery_ast, at, farm_event) + end +end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farmware_env_worker.ex b/lib/core/asset_workers/farmware_env_worker.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset_workers/farmware_env_worker.ex rename to lib/core/asset_workers/farmware_env_worker.ex diff --git a/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex b/lib/core/asset_workers/farmware_installation_worker.ex similarity index 76% rename from farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex rename to lib/core/asset_workers/farmware_installation_worker.ex index 3afb4d6df..a7c56d537 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/farmware_installation_worker.ex +++ b/lib/core/asset_workers/farmware_installation_worker.ex @@ -8,7 +8,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do @install_dir "/tmp/farmware" @error_retry_time_ms 25_000 - @back_off_time_ms 5_000 + @back_off_time_ms 5_000 @manifest_name "manifest.json" def preload(%FWI{}), do: [] @@ -29,20 +29,30 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do def handle_info(:timeout, %{fwi: %{manifest: nil} = fwi} = state) do with {:ok, %{} = manifest} <- get_manifest_json(fwi), - %{valid?: true} = changeset <- FWI.changeset(fwi, %{manifest: manifest}), + %{valid?: true} = changeset <- + FWI.changeset(fwi, %{manifest: manifest}), {:ok, %FWI{} = updated} <- Repo.update(changeset), {:ok, zip_binary} <- get_zip(updated), :ok <- install_zip(updated, zip_binary), :ok <- install_farmware_tools(updated), :ok <- write_manifest(updated) do # TODO(Connor) -> No reason to keep this process alive? - BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) + BotState.report_farmware_installed( + updated.manifest.package, + Manifest.view(updated.manifest) + ) + {:noreply, %{state | backoff: 0}} else error -> backoff = state.backoff + @back_off_time_ms timeout = @error_retry_time_ms + backoff - error_log(fwi, "Failed to download Farmware manifest. Trying again in #{timeout}ms #{inspect(error)}") + + error_log( + fwi, + "Failed to download Farmware manifest. Trying again in #{timeout}ms #{inspect(error)}" + ) + {:noreply, %{state | backoff: backoff}, timeout} end end @@ -54,16 +64,19 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do # incompatible APIS in farmware tools (because farmware tools wasn't updated) def handle_info(:timeout, %{fwi: %FWI{} = fwi} = state) do with {:ok, %{} = i_manifest} <- load_manifest_json(fwi), - %{valid?: true} = d_changeset <- FWI.changeset(fwi, %{manifest: i_manifest}), + %{valid?: true} = d_changeset <- + FWI.changeset(fwi, %{manifest: i_manifest}), %FWI{} = dirty <- Ecto.Changeset.apply_changes(d_changeset), {:ok, n_manifest} <- get_manifest_json(fwi), - %{valid?: true} = n_changeset <- FWI.changeset(fwi, %{manifest: n_manifest}), + %{valid?: true} = n_changeset <- + FWI.changeset(fwi, %{manifest: n_manifest}), {:ok, %FWI{} = updated} <- Repo.update(n_changeset) do maybe_update(%{state | fwi: dirty}, updated) else # Farmware wasn't found. Reinstall {:error, :enoent} -> error_log(fwi, "farmware not installed. Maybe uninstalled out of band?") + updated = FWI.changeset(fwi, %{manifest: nil, updated_at: fwi.updated_at}) |> Repo.update!() @@ -73,24 +86,40 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do error -> backoff = state.backoff + @back_off_time_ms timeout = @error_retry_time_ms + backoff - error_log(fwi, "failed to check for updates. Trying again in #{timeout}ms #{inspect(error)}") + + error_log( + fwi, + "failed to check for updates. Trying again in #{timeout}ms #{inspect(error)}" + ) + {:noreply, %{state | backoff: backoff}, timeout} end end def maybe_update(%{fwi: %FWI{} = installed_fwi} = state, %FWI{} = updated) do - case Version.compare(installed_fwi.manifest.package_version, updated.manifest.package_version) do + case Version.compare( + installed_fwi.manifest.package_version, + updated.manifest.package_version + ) do # Installed is newer than remote. :gt -> success_log(updated, "up to date.") - BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) + + BotState.report_farmware_installed( + updated.manifest.package, + Manifest.view(updated.manifest) + ) {:noreply, %{state | fwi: updated}} # No difference between installed and remote. :eq -> success_log(updated, "up to date.") - BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) + + BotState.report_farmware_installed( + updated.manifest.package, + Manifest.view(updated.manifest) + ) {:noreply, %{state | fwi: updated}} @@ -102,14 +131,22 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do :ok <- install_zip(updated, zip_binary), :ok <- install_farmware_tools(updated), :ok <- write_manifest(updated) do - BotState.report_farmware_installed(updated.manifest.package, Manifest.view(updated.manifest)) - {:noreply, %{state | fwi: updated, backoff: 0}} + BotState.report_farmware_installed( + updated.manifest.package, + Manifest.view(updated.manifest) + ) + {:noreply, %{state | fwi: updated, backoff: 0}} else er -> backoff = state.backoff + @back_off_time_ms timeout = @error_retry_time_ms + backoff - error_log(updated, "update failed. Trying again in #{timeout}ms #{inspect(er)}") + + error_log( + updated, + "update failed. Trying again in #{timeout}ms #{inspect(er)}" + ) + {:noreply, %{state | fwi: updated, backoff: backoff}, timeout} end end @@ -144,7 +181,8 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do Enum.map(files, fn filename -> {to_charlist(filename), File.read!(Path.join(path, filename))} end), - {:ok, {_path, zip_binary}} <- :zip.create(to_charlist(path), file_list, [:memory]) do + {:ok, {_path, zip_binary}} <- + :zip.create(to_charlist(path), file_list, [:memory]) do {:ok, zip_binary} end end @@ -176,16 +214,20 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do |> File.write(json) end - def install_farmware_tools(%FWI{manifest: %{farmware_tools_version_requirement: _version}} = fwi) do + def install_farmware_tools( + %FWI{manifest: %{farmware_tools_version_requirement: _version}} = fwi + ) do install_dir = install_dir(fwi) File.mkdir_p(Path.join(install_dir, "farmware_tools")) - release_url = "https://api.github.com/repos/FarmBot-Labs/farmware-tools/releases/latest" - # if version == "latest" do - # "https://api.github.com/repos/FarmBot-Labs/farmware-tools/releases/latest" - # else - # "https://api.github.com/repos/FarmBot-Labs/farmware-tools/releases/tags/#{version}" - # end + release_url = + "https://api.github.com/repos/FarmBot-Labs/farmware-tools/releases/latest" + + # if version == "latest" do + # "https://api.github.com/repos/FarmBot-Labs/farmware-tools/releases/latest" + # else + # "https://api.github.com/repos/FarmBot-Labs/farmware-tools/releases/tags/#{version}" + # end with {:ok, {_commit, zip_url}} <- get_tools_zip_url(release_url), {:ok, zip_binary} <- get_zip(zip_url), @@ -199,7 +241,11 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do {:ok, list} when is_list(list) -> Enum.each(list, fn {filename, data} -> out_file = - Path.join([install_dir, "farmware_tools", Path.basename(to_string(filename))]) + Path.join([ + install_dir, + "farmware_tools", + Path.basename(to_string(filename)) + ]) File.write!(out_file, data) end) @@ -231,7 +277,12 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FarmwareInstallation do end defp get(url) do - FarmbotTelemetry.HTTP.request(:get, {to_charlist(url), httpc_headers()}, [], httpc_options()) + FarmbotOS.HTTP.request( + :get, + {to_charlist(url), httpc_headers()}, + [], + httpc_options() + ) end defp httpc_options, do: [body_format: :binary] diff --git a/farmbot_core/lib/farmbot_core/asset_workers/fbos_config_worker.ex b/lib/core/asset_workers/fbos_config_worker.ex similarity index 52% rename from farmbot_core/lib/farmbot_core/asset_workers/fbos_config_worker.ex rename to lib/core/asset_workers/fbos_config_worker.ex index ff6c49bf0..f4f8d07d2 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/fbos_config_worker.ex +++ b/lib/core/asset_workers/fbos_config_worker.ex @@ -22,7 +22,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FbosConfig do @impl GenServer def init(%FbosConfig{} = fbos_config) do - {:ok, %{ fbos_config: fbos_config }} + {:ok, %{fbos_config: fbos_config}} end @impl GenServer @@ -33,7 +33,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FbosConfig do end @impl GenServer - def handle_cast({:new_data, new_fbos_config}, %{fbos_config: %FbosConfig{} = old_fbos_config} = state) do + def handle_cast( + {:new_data, new_fbos_config}, + %{fbos_config: %FbosConfig{} = old_fbos_config} = state + ) do _ = set_config_to_state(new_fbos_config, old_fbos_config) {:noreply, %{state | fbos_config: new_fbos_config}} end @@ -46,39 +49,81 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FbosConfig do :sequence_complete_log, :sequence_init_log ] - new_interesting_fbos_config = Map.take(new_fbos_config, interesting_params) |> MapSet.new() - old_interesting_fbos_config = Map.take(old_fbos_config, interesting_params) |> MapSet.new() - difference = MapSet.difference(new_interesting_fbos_config, old_interesting_fbos_config) + + new_interesting_fbos_config = + Map.take(new_fbos_config, interesting_params) |> MapSet.new() + + old_interesting_fbos_config = + Map.take(old_fbos_config, interesting_params) |> MapSet.new() + + difference = + MapSet.difference( + new_interesting_fbos_config, + old_interesting_fbos_config + ) + Enum.each(difference, fn {:os_auto_update, bool} -> - FarmbotCore.Logger.success 1, "Set OS auto update to #{bool}" + FarmbotCore.Logger.success(1, "Set OS auto update to #{bool}") {:network_not_found_timer, minutes} -> - FarmbotCore.Logger.success 1, "Set connection attempt period to #{minutes} minutes" + FarmbotCore.Logger.success( + 1, + "Set connection attempt period to #{minutes} minutes" + ) {:sequence_body_log, bool} -> - FarmbotCore.Logger.success 1, "Set sequence step log messages to #{bool}" + FarmbotCore.Logger.success( + 1, + "Set sequence step log messages to #{bool}" + ) {:sequence_complete_log, bool} -> - FarmbotCore.Logger.success 1, "Set sequence complete log messages to #{bool}" + FarmbotCore.Logger.success( + 1, + "Set sequence complete log messages to #{bool}" + ) {:sequence_init_log, bool} -> - FarmbotCore.Logger.success 1, "Set sequence init log messages to #{bool}" + FarmbotCore.Logger.success( + 1, + "Set sequence init log messages to #{bool}" + ) {param, value} -> - FarmbotCore.Logger.success 1, "Set #{param} to #{value}" + FarmbotCore.Logger.success(1, "Set #{param} to #{value}") end) + set_config_to_state(new_fbos_config) end def set_config_to_state(fbos_config) do # firmware_hardware is set by FarmbotCore.Firmware.SideEffects - :ok = BotState.set_config_value(:network_not_found_timer, fbos_config.network_not_found_timer) + :ok = + BotState.set_config_value( + :network_not_found_timer, + fbos_config.network_not_found_timer + ) + :ok = BotState.set_config_value(:os_auto_update, fbos_config.os_auto_update) # CeleryScript - :ok = BotState.set_config_value(:sequence_body_log, fbos_config.sequence_body_log) - :ok = BotState.set_config_value(:sequence_complete_log, fbos_config.sequence_complete_log) - :ok = BotState.set_config_value(:sequence_init_log, fbos_config.sequence_init_log) + :ok = + BotState.set_config_value( + :sequence_body_log, + fbos_config.sequence_body_log + ) + + :ok = + BotState.set_config_value( + :sequence_complete_log, + fbos_config.sequence_complete_log + ) + + :ok = + BotState.set_config_value( + :sequence_init_log, + fbos_config.sequence_init_log + ) end end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/firmware_config_worker.ex b/lib/core/asset_workers/firmware_config_worker.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/asset_workers/firmware_config_worker.ex rename to lib/core/asset_workers/firmware_config_worker.ex diff --git a/farmbot_core/lib/farmbot_core/asset_workers/first_party_farmware_worker.ex b/lib/core/asset_workers/first_party_farmware_worker.ex similarity index 99% rename from farmbot_core/lib/farmbot_core/asset_workers/first_party_farmware_worker.ex rename to lib/core/asset_workers/first_party_farmware_worker.ex index 18bc5d53b..709639824 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/first_party_farmware_worker.ex +++ b/lib/core/asset_workers/first_party_farmware_worker.ex @@ -17,4 +17,4 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.FirstPartyFarmware do fwi = %{fwi | __struct__: FarmbotCore.Asset.FarmwareInstallation} FarmwareInstallation.start_link(fwi, args) end -end \ No newline at end of file +end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex b/lib/core/asset_workers/peripheral_worker.ex similarity index 73% rename from farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex rename to lib/core/asset_workers/peripheral_worker.ex index 75e15f6a3..f4d3cd8c2 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex +++ b/lib/core/asset_workers/peripheral_worker.ex @@ -20,9 +20,17 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do @impl true def init(peripheral) do - %{informational_settings: %{idle: idle, firmware_version: fw_version}} = BotState.subscribe() - state = %{peripheral: peripheral, errors: 0, fw_idle: idle || false, fw_version: fw_version} - send self(), :timeout + %{informational_settings: %{idle: idle, firmware_version: fw_version}} = + BotState.subscribe() + + state = %{ + peripheral: peripheral, + errors: 0, + fw_idle: idle || false, + fw_version: fw_version + } + + send(self(), :timeout) {:ok, state} end @@ -46,27 +54,46 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do def handle_info(:timeout, %{peripheral: peripheral, errors: errors} = state) do Logger.debug("Read peripheral: #{peripheral.label}") rpc = peripheral_to_rpc(peripheral) + case FarmbotCore.Celery.execute(rpc, make_ref()) do :ok -> Logger.debug("Read peripheral: #{peripheral.label} ok") {:noreply, state} {:error, reason} when errors < 5 -> - Logger.error("Read peripheral: #{peripheral.label} error: #{reason} errors=#{state.errors}") + Logger.error( + "Read peripheral: #{peripheral.label} error: #{reason} errors=#{state.errors}" + ) + Process.send_after(self(), :timeout, @retry_ms) {:noreply, %{state | errors: state.errors + 1}} {:error, reason} when errors == 5 -> - Logger.error("Read peripheral: #{peripheral.label} error: #{reason} errors=5 not trying again.") + Logger.error( + "Read peripheral: #{peripheral.label} error: #{reason} errors=5 not trying again." + ) + {:noreply, state} end end - def handle_info({BotState, %{changes: %{informational_settings: %{changes: %{idle: idle}}}}}, state) do + def handle_info( + {BotState, + %{changes: %{informational_settings: %{changes: %{idle: idle}}}}}, + state + ) do {:noreply, %{state | fw_idle: idle}} end - def handle_info({BotState, %{changes: %{informational_settings: %{changes: %{firmware_version: fw_version}}}}}, state) do + def handle_info( + {BotState, + %{ + changes: %{ + informational_settings: %{changes: %{firmware_version: fw_version}} + } + }}, + state + ) do {:noreply, %{state | fw_version: fw_version}} end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex b/lib/core/asset_workers/pin_binding_worker.ex similarity index 70% rename from farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex rename to lib/core/asset_workers/pin_binding_worker.ex index 4bd583cbe..a28c237c8 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex +++ b/lib/core/asset_workers/pin_binding_worker.ex @@ -23,10 +23,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do @error_retry_time_ms 5000 - @gpio_handler Application.get_env(:farmbot_core, __MODULE__)[:gpio_handler] + @gpio_handler Application.get_env(:farmbot, __MODULE__)[:gpio_handler] @gpio_handler || Mix.raise(""" - config :farmbot_core, #{__MODULE__}, gpio_handler: MyModule + config :farmbot, #{__MODULE__}, gpio_handler: MyModule """) @typedoc "Opaque function that should be called upon a trigger" @@ -65,25 +65,39 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do end @impl true - def handle_cast(:trigger, %{pin_binding: %{special_action: nil} = pin_binding} = state) do + def handle_cast( + :trigger, + %{pin_binding: %{special_action: nil} = pin_binding} = state + ) do case Asset.get_sequence(pin_binding.sequence_id) do %Sequence{name: name} = seq -> - FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing #{name}") + FarmbotCore.Logger.info( + 1, + "#{pin_binding} triggered, executing #{name}" + ) AST.decode(seq) |> execute(state) nil -> - FarmbotCore.Logger.error(1, "Failed to find associated Sequence for: #{pin_binding}") + FarmbotCore.Logger.error( + 1, + "Failed to find associated Sequence for: #{pin_binding}" + ) + {:noreply, state} end end def handle_cast( :trigger, - %{pin_binding: %{special_action: "emergency_lock"} = pin_binding} = state + %{pin_binding: %{special_action: "emergency_lock"} = pin_binding} = + state ) do - FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Lock") + FarmbotCore.Logger.info( + 1, + "#{pin_binding} triggered, executing Emergency Lock" + ) AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -93,9 +107,13 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do def handle_cast( :trigger, - %{pin_binding: %{special_action: "emergency_unlock"} = pin_binding} = state + %{pin_binding: %{special_action: "emergency_unlock"} = pin_binding} = + state ) do - FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Unlock") + FarmbotCore.Logger.info( + 1, + "#{pin_binding} triggered, executing Emergency Unlock" + ) AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -103,7 +121,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do |> execute(state) end - def handle_cast(:trigger, %{pin_binding: %{special_action: "power_off"} = pin_binding} = state) do + def handle_cast( + :trigger, + %{pin_binding: %{special_action: "power_off"} = pin_binding} = state + ) do FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Power Off") AST.Factory.new() @@ -116,7 +137,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do :trigger, %{pin_binding: %{special_action: "read_status"} = pin_binding} = state ) do - FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Read Status") + FarmbotCore.Logger.info( + 1, + "#{pin_binding} triggered, executing Read Status" + ) AST.Factory.new() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -124,19 +148,28 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do |> execute(state) end - def handle_cast(:trigger, %{pin_binding: %{special_action: "reboot"} = pin_binding} = state) do + def handle_cast( + :trigger, + %{pin_binding: %{special_action: "reboot"} = pin_binding} = state + ) do FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Reboot") - FarmbotCore.Celery.SysCalls.reboot() + FarmbotCore.Celery.SysCallGlue.reboot() {:noreply, state} end - def handle_cast(:trigger, %{pin_binding: %{special_action: "sync"} = pin_binding} = state) do + def handle_cast( + :trigger, + %{pin_binding: %{special_action: "sync"} = pin_binding} = state + ) do FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Sync") - FarmbotCore.Celery.SysCalls.sync() + FarmbotCore.Celery.SysCallGlue.sync() {:noreply, state} end - def handle_cast(:trigger, %{pin_binding: %{special_action: "take_photo"} = pin_binding} = state) do + def handle_cast( + :trigger, + %{pin_binding: %{special_action: "take_photo"} = pin_binding} = state + ) do FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Take Photo") AST.Factory.new() @@ -154,7 +187,9 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do def handle_info(:timeout, %{pin_binding: pin_binding} = state) do worker_pid = self() - case gpio_handler().start_link(pin_binding.pin_num, fn -> trigger(worker_pid) end) do + case gpio_handler().start_link(pin_binding.pin_num, fn -> + trigger(worker_pid) + end) do {:ok, pid} when is_pid(pid) -> Process.link(pid) {:noreply, state} @@ -164,7 +199,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do {:noreply, state} {:error, reason} -> - Logger.error("Failed to start PinBinding GPIO Handler: #{inspect(reason)}") + Logger.error( + "Failed to start PinBinding GPIO Handler: #{inspect(reason)}" + ) + {:noreply, state, @error_retry_time_ms} :ignore -> @@ -184,12 +222,16 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do {:error, reason} -> Logger.error("BAD AST: " <> inspect(ast)) - FarmbotCore.Logger.error(1, "error executing #{state.pin_binding}: #{reason}") + + FarmbotCore.Logger.error( + 1, + "error executing #{state.pin_binding}: #{reason}" + ) end {:noreply, state} end defp gpio_handler, - do: Application.get_env(:farmbot_core, __MODULE__)[:gpio_handler] + do: Application.get_env(:farmbot, __MODULE__)[:gpio_handler] end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker/stub_gpio_handler.ex b/lib/core/asset_workers/pin_binding_worker/stub_gpio_handler.ex similarity index 99% rename from farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker/stub_gpio_handler.ex rename to lib/core/asset_workers/pin_binding_worker/stub_gpio_handler.ex index 3b025c93c..9200ae4a3 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker/stub_gpio_handler.ex +++ b/lib/core/asset_workers/pin_binding_worker/stub_gpio_handler.ex @@ -11,7 +11,6 @@ defmodule FarmbotCore.PinBindingWorker.StubGPIOHandler do FarmbotCore.Logger.report_termination() - def debug_trigger(pin_number) do GenServer.call(name(pin_number), :debug_trigger) end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/public_key_worker.ex b/lib/core/asset_workers/public_key_worker.ex similarity index 80% rename from farmbot_core/lib/farmbot_core/asset_workers/public_key_worker.ex rename to lib/core/asset_workers/public_key_worker.ex index 766f7f35c..eb17135c8 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/public_key_worker.ex +++ b/lib/core/asset_workers/public_key_worker.ex @@ -2,10 +2,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PublicKey do alias FarmbotCore.Asset.PublicKey use GenServer - @ssh_handler Application.get_env(:farmbot_core, __MODULE__)[:ssh_handler] + @ssh_handler Application.get_env(:farmbot, __MODULE__)[:ssh_handler] @ssh_handler || Mix.raise(""" - config :farmbot_core, #{__MODULE__}, + config :farmbot, #{__MODULE__}, ssh_handler: FarmbotCore.PublicKeyHandler.StubSSHHandler """) @@ -31,6 +31,6 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PublicKey do end def ssh_handler() do - Application.get_env(:farmbot_core, __MODULE__)[:ssh_handler] + Application.get_env(:farmbot, __MODULE__)[:ssh_handler] end end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/public_key_worker/stub_ssh_handler.ex b/lib/core/asset_workers/public_key_worker/stub_ssh_handler.ex similarity index 97% rename from farmbot_core/lib/farmbot_core/asset_workers/public_key_worker/stub_ssh_handler.ex rename to lib/core/asset_workers/public_key_worker/stub_ssh_handler.ex index 5ca1b4b8e..1ad475204 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/public_key_worker/stub_ssh_handler.ex +++ b/lib/core/asset_workers/public_key_worker/stub_ssh_handler.ex @@ -2,4 +2,4 @@ defmodule FarmbotCore.PublicKeyHandler.StubSSHHandler do @behaviour FarmbotCore.Asset.PublicKey def ready?(), do: true def add_key(_key), do: :ok -end \ No newline at end of file +end diff --git a/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex b/lib/core/asset_workers/regimen_instance_worker.ex similarity index 58% rename from farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex rename to lib/core/asset_workers/regimen_instance_worker.ex index 488e2c69f..01df89f86 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex +++ b/lib/core/asset_workers/regimen_instance_worker.ex @@ -27,7 +27,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do def init([regimen_instance, _args]) do with %Regimen{} <- regimen_instance.regimen, %FarmEvent{} <- regimen_instance.farm_event do - send self(), :schedule + send(self(), :schedule) {:ok, %{regimen_instance: regimen_instance}} else _ -> {:stop, "Regimen instance not preloaded."} @@ -38,37 +38,63 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do def handle_info(:schedule, state) do regimen_instance = state.regimen_instance # load the sequence and calculate the scheduled_at time - Enum.map(regimen_instance.regimen.regimen_items, fn(%{time_offset: offset, sequence_id: sequence_id}) -> + Enum.map(regimen_instance.regimen.regimen_items, fn %{ + time_offset: offset, + sequence_id: + sequence_id + } -> scheduled_at = DateTime.add(regimen_instance.epoch, offset, :millisecond) - sequence = Asset.get_sequence(sequence_id) || raise("sequence #{sequence_id} is not synced") + + sequence = + Asset.get_sequence(sequence_id) || + raise("sequence #{sequence_id} is not synced") + %{scheduled_at: scheduled_at, sequence: sequence} end) # get rid of any item that has already been scheduled/executed - |> Enum.reject(fn(%{scheduled_at: scheduled_at}) -> + |> Enum.reject(fn %{scheduled_at: scheduled_at} -> Asset.get_regimen_instance_execution(regimen_instance, scheduled_at) end) # get rid of any item that has already passed - |> Enum.reject(fn(%{scheduled_at: scheduled_at}) -> - DateTime.compare(scheduled_at, DateTime.utc_now() |> DateTime.add(-120, :second)) == :lt + |> Enum.reject(fn %{scheduled_at: scheduled_at} -> + DateTime.compare( + scheduled_at, + DateTime.utc_now() |> DateTime.add(-120, :second) + ) == :lt end) - |> Enum.each(fn(%{scheduled_at: at, sequence: sequence}) -> + |> Enum.each(fn %{scheduled_at: at, sequence: sequence} -> schedule_sequence(regimen_instance, sequence, at) end) + {:noreply, state} end - def handle_info({FarmbotCore.Celery, {:scheduled_execution, scheduled_at, executed_at, result}}, state) do - status = case result do - :ok -> "ok" - {:error, reason} -> - FarmbotCore.Logger.error(2, "Regimen scheduled at #{scheduled_at} failed to execute: #{reason}") - reason - end - _ = Asset.add_execution_to_regimen_instance!(state.regimen_instance, %{ - scheduled_at: scheduled_at, - executed_at: executed_at, - status: status - }) + def handle_info( + {FarmbotCore.Celery, + {:scheduled_execution, scheduled_at, executed_at, result}}, + state + ) do + status = + case result do + :ok -> + "ok" + + {:error, reason} -> + FarmbotCore.Logger.error( + 2, + "Regimen scheduled at #{scheduled_at} failed to execute: #{reason}" + ) + + reason + end + + _ = + Asset.add_execution_to_regimen_instance!(state.regimen_instance, %{ + scheduled_at: scheduled_at, + executed_at: executed_at, + status: status + }) + {:noreply, state} end @@ -76,17 +102,26 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.RegimenInstance do # the `locals` of a sequence, which works but is not-so-clean. Refactor later # when we have a better idea of the problem. @doc false - def schedule_sequence(%RegimenInstance{} = regimen_instance, %Sequence{} = sequence, at) do + def schedule_sequence( + %RegimenInstance{} = regimen_instance, + %Sequence{} = sequence, + at + ) do # FarmEvent is the furthest outside of the scope farm_event_params = AST.decode(regimen_instance.farm_event.body) # Regimen is the second scope regimen_params = AST.decode(regimen_instance.regimen.body) # there may be many sequence scopes from here downward - celery_ast = AST.decode(sequence) + celery_ast = AST.decode(sequence) + celery_args = celery_ast.args |> Map.put(:sequence_name, sequence.name) - |> Map.put(:locals, %{celery_ast.args.locals | body: celery_ast.args.locals.body ++ regimen_params ++ farm_event_params}) + |> Map.put(:locals, %{ + celery_ast.args.locals + | body: + celery_ast.args.locals.body ++ regimen_params ++ farm_event_params + }) celery_ast = %{celery_ast | args: celery_args} FarmbotCore.Celery.schedule(celery_ast, at, sequence) diff --git a/farmbot_core/lib/farmbot_core/bot_state.ex b/lib/core/bot_state.ex similarity index 95% rename from farmbot_core/lib/farmbot_core/bot_state.ex rename to lib/core/bot_state.ex index 31a5e95af..8f523df41 100644 --- a/farmbot_core/lib/farmbot_core/bot_state.ex +++ b/lib/core/bot_state.ex @@ -161,8 +161,15 @@ defmodule FarmbotCore.BotState do GenServer.call(bot_state_server, {:report_wifi_level_percent, percent}) end - def report_farmware_installed(bot_state_server \\ __MODULE__, name, %{} = manifest) do - GenServer.call(bot_state_server, {:report_farmware_installed, name, manifest}) + def report_farmware_installed( + bot_state_server \\ __MODULE__, + name, + %{} = manifest + ) do + GenServer.call( + bot_state_server, + {:report_farmware_installed, name, manifest} + ) end @doc "Put FBOS into maintenance mode." @@ -187,7 +194,7 @@ defmodule FarmbotCore.BotState do def handle_call({:job_in_progress?, job_name}, _from, state) do progress = (state.tree.jobs[job_name] || %Percent{}).percent - in_progress? = (progress > 0.0 && progress < 100.0) + in_progress? = progress > 0.0 && progress < 100.0 {:reply, in_progress?, state} end @@ -195,7 +202,8 @@ defmodule FarmbotCore.BotState do def handle_call(:subscribe, {pid, _} = _from, state) do # TODO Just replace this with Elixir.Registry? # Process.link(pid) - {:reply, state.tree, %{state | subscribers: Enum.uniq([pid | state.subscribers])}} + {:reply, state.tree, + %{state | subscribers: Enum.uniq([pid | state.subscribers])}} end def handle_call(:fetch, _from, state) do @@ -412,7 +420,7 @@ defmodule FarmbotCore.BotState do def handle_call({:report_farmware_installed, name, manifest}, _from, state) do {reply, state} = BotStateNG.add_or_update_farmware(state.tree, name, manifest) - |> dispatch_and_apply(state) + |> dispatch_and_apply(state) {:reply, reply, state} end @@ -424,7 +432,8 @@ defmodule FarmbotCore.BotState do {:reply, reply, state} end - defp dispatch_and_apply(%Ecto.Changeset{changes: changes}, state) when map_size(changes) == 0 do + defp dispatch_and_apply(%Ecto.Changeset{changes: changes}, state) + when map_size(changes) == 0 do {:ok, state} end @@ -458,13 +467,15 @@ defmodule FarmbotCore.BotState do # large numbers of photos. defp remove_old_jobs(state) do now = :os.system_time(:seconds) - reject = fn {_name, job} -> (now - job.updated_at) > 120 end + reject = fn {_name, job} -> now - job.updated_at > 120 end recombine = fn {name, job}, acc -> Map.put(acc, name, job) end - next_jobs = state.tree.jobs - |> Map.to_list() - |> Enum.reject(reject) - |> Enum.reduce(%{}, recombine) - %{state | tree: %{state.tree | jobs: next_jobs} } + next_jobs = + state.tree.jobs + |> Map.to_list() + |> Enum.reject(reject) + |> Enum.reduce(%{}, recombine) + + %{state | tree: %{state.tree | jobs: next_jobs}} end end diff --git a/farmbot_core/lib/farmbot_core/bot_state/filesystem.ex b/lib/core/bot_state/filesystem.ex similarity index 70% rename from farmbot_core/lib/farmbot_core/bot_state/filesystem.ex rename to lib/core/bot_state/filesystem.ex index 58a6922ee..bd70b3bf7 100644 --- a/farmbot_core/lib/farmbot_core/bot_state/filesystem.ex +++ b/lib/core/bot_state/filesystem.ex @@ -7,7 +7,7 @@ defmodule FarmbotCore.BotState.FileSystem do use GenServer alias FarmbotCore.BotState - @root_dir Application.get_env(:farmbot_core, __MODULE__)[:root_dir] + @root_dir Application.get_env(:farmbot, __MODULE__)[:root_dir] @sleep_time 8_000 @type path_and_data :: {Path.t(), binary()} @@ -17,7 +17,6 @@ defmodule FarmbotCore.BotState.FileSystem do GenServer.start_link(__MODULE__, args, opts) end - def init(args) do root_dir = Keyword.get(args, :root_dir, @root_dir) sleep_time = Keyword.get(args, :sleep_time, @sleep_time) @@ -28,6 +27,7 @@ defmodule FarmbotCore.BotState.FileSystem do nil -> BotState.subscribe() pid -> BotState.subscribe(pid) end + {:ok, %{root_dir: root_dir, bot_state: bot_state, sleep_time: sleep_time}} end @@ -71,14 +71,30 @@ defmodule FarmbotCore.BotState.FileSystem do def serialize_state(%{} = bot_state, prefix, acc) do Enum.reduce(bot_state, acc, fn {key, value}, acc -> cond do - is_map(value) && map_size(value) == 0 -> [Path.join(prefix, to_string(key)) | acc] - match?(%DateTime{}, value) -> [{Path.join(prefix, to_string(value)), to_string(value)} | acc] - is_map(value) -> serialize_state(value, Path.join(prefix, to_string(key)), acc) - is_number(value) -> [{Path.join(prefix, to_string(key)), to_string(value)} | acc] - is_binary(value) -> [{Path.join(prefix, to_string(key)), to_string(value)} | acc] - is_atom(value) -> [{Path.join(prefix, to_string(key)), to_string(value)} | acc] - is_boolean(value) -> [{Path.join(prefix, to_string(key)), to_string(value)} | acc] - is_nil(value) -> [{Path.join(prefix, to_string(key)), <<0x0>>} | acc] + is_map(value) && map_size(value) == 0 -> + [Path.join(prefix, to_string(key)) | acc] + + match?(%DateTime{}, value) -> + [{Path.join(prefix, to_string(value)), to_string(value)} | acc] + + is_map(value) -> + serialize_state(value, Path.join(prefix, to_string(key)), acc) + + is_number(value) -> + [{Path.join(prefix, to_string(key)), to_string(value)} | acc] + + is_binary(value) -> + [{Path.join(prefix, to_string(key)), to_string(value)} | acc] + + is_atom(value) -> + [{Path.join(prefix, to_string(key)), to_string(value)} | acc] + + is_boolean(value) -> + [{Path.join(prefix, to_string(key)), to_string(value)} | acc] + + is_nil(value) -> + [{Path.join(prefix, to_string(key)), <<0x0>>} | acc] + is_list(value) -> Logger.error("Arrays can not be serialized to filesystem nodes") acc diff --git a/farmbot_core/lib/farmbot_core/bot_state/job_progress.ex b/lib/core/bot_state/job_progress.ex similarity index 76% rename from farmbot_core/lib/farmbot_core/bot_state/job_progress.ex rename to lib/core/bot_state/job_progress.ex index 3008b4fb9..131c5088b 100644 --- a/farmbot_core/lib/farmbot_core/bot_state/job_progress.ex +++ b/lib/core/bot_state/job_progress.ex @@ -4,7 +4,6 @@ defmodule FarmbotCore.BotState.JobProgress do @typedoc "Unit of the job. Will be `percent` | `bytes`" @type unit :: String.t() - @typedoc "Status of the job. Will be `error` | `working` | `complete`" @type status :: String.t() @@ -12,7 +11,12 @@ defmodule FarmbotCore.BotState.JobProgress do defmodule Percent do @moduledoc "Percent job." - defstruct status: "working", percent: 0, unit: "percent", type: "ota", time: nil, file_type: nil + defstruct status: "working", + percent: 0, + unit: "percent", + type: "ota", + time: nil, + file_type: nil defimpl Inspect, for: __MODULE__ do def inspect(%{percent: percent}, _) do @@ -24,7 +28,7 @@ defmodule FarmbotCore.BotState.JobProgress do status: JobProgress.status(), percent: integer, unit: JobProgress.unit(), - type: String.t, + type: String.t(), file_type: binary(), time: DateTime.t() } @@ -32,7 +36,12 @@ defmodule FarmbotCore.BotState.JobProgress do defmodule Bytes do @moduledoc "Bytes job." - defstruct status: "working", bytes: 0, unit: "bytes", type: "ota", time: nil, file_type: nil + defstruct status: "working", + bytes: 0, + unit: "bytes", + type: "ota", + time: nil, + file_type: nil defimpl Inspect, for: __MODULE__ do def inspect(%{bytes: bytes}, _) do diff --git a/farmbot_core/lib/farmbot_core/bot_state/scheduler_usage_reporter.ex b/lib/core/bot_state/scheduler_usage_reporter.ex similarity index 94% rename from farmbot_core/lib/farmbot_core/bot_state/scheduler_usage_reporter.ex rename to lib/core/bot_state/scheduler_usage_reporter.ex index 51850f95b..b7d0246d0 100644 --- a/farmbot_core/lib/farmbot_core/bot_state/scheduler_usage_reporter.ex +++ b/lib/core/bot_state/scheduler_usage_reporter.ex @@ -83,9 +83,7 @@ defmodule FarmbotCore.BotState.SchedulerUsageReporter do load_average = String.slice(IO.read(state.load_ave_dev, :line), 0..-2) Logger.debug( - "sched usage #{round(usage)}% : run queue lengths #{ - inspect(:erlang.statistics(:run_queue_lengths)) - } : load average #{load_average}" + "sched usage #{round(usage)}% : run queue lengths #{inspect(:erlang.statistics(:run_queue_lengths))} : load average #{load_average}" ) end diff --git a/lib/core/bot_state/supervisor.ex b/lib/core/bot_state/supervisor.ex new file mode 100644 index 000000000..614883894 --- /dev/null +++ b/lib/core/bot_state/supervisor.ex @@ -0,0 +1,18 @@ +defmodule FarmbotCore.BotState.Supervisor do + use Supervisor + + def start_link(args) do + Supervisor.start_link(__MODULE__, args, name: __MODULE__) + end + + def init([]) do + Supervisor.init(children(), strategy: :one_for_all) + end + + def children, + do: [ + FarmbotCore.BotState, + FarmbotCore.BotState.FileSystem, + FarmbotCore.BotState.SchedulerUsageReporter + ] +end diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng.ex b/lib/core/bot_state_ng.ex similarity index 86% rename from farmbot_core/lib/farmbot_core/bot_state_ng.ex rename to lib/core/bot_state_ng.ex index 2eb9f2eeb..4e682e4ba 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng.ex +++ b/lib/core/bot_state_ng.ex @@ -20,12 +20,16 @@ defmodule FarmbotCore.BotStateNG do embedded_schema do embeds_one(:mcu_params, McuParams, on_replace: :update) embeds_one(:location_data, LocationData, on_replace: :update) - embeds_one(:informational_settings, InformationalSettings, on_replace: :update) + + embeds_one(:informational_settings, InformationalSettings, + on_replace: :update + ) + embeds_one(:configuration, Configuration, on_replace: :update) - field(:user_env, {:map, {:string, :any}}, default: %{}) - field(:process_info, {:map, {:string, :any}}, default: %{farmwares: %{}}) - field(:pins, {:map, {:integer, :map}}, default: %{}) - field(:jobs, {:map, {:string, :map}}, default: %{}) + field(:user_env, :map, default: %{}) + field(:process_info, :map, default: %{farmwares: %{}}) + field(:pins, :map, default: %{}) + field(:jobs, :map, default: %{}) end def new do @@ -51,7 +55,8 @@ defmodule FarmbotCore.BotStateNG do %{ mcu_params: McuParams.view(bot_state.mcu_params), location_data: LocationData.view(bot_state.location_data), - informational_settings: InformationalSettings.view(bot_state.informational_settings), + informational_settings: + InformationalSettings.view(bot_state.informational_settings), configuration: Configuration.view(bot_state.configuration), process_info: bot_state.process_info, user_env: bot_state.user_env, @@ -81,6 +86,7 @@ defmodule FarmbotCore.BotStateNG do |> get_field(:process_info) |> Map.get(:farmwares) |> Map.put(name, manifest) + put_change(cs, :process_info, %{farmwares: new_farmwares}) end @@ -100,6 +106,7 @@ defmodule FarmbotCore.BotStateNG do def set_job_progress(state, name, progress) do cs = changeset(state, %{}) progress2 = Map.put(progress, :updated_at, :os.system_time(:seconds)) + new_jobs = cs |> get_field(:jobs) diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/configuration.ex b/lib/core/bot_state_ng/configuration.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/bot_state_ng/configuration.ex rename to lib/core/bot_state_ng/configuration.ex diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/informational_settings.ex b/lib/core/bot_state_ng/informational_settings.ex similarity index 97% rename from farmbot_core/lib/farmbot_core/bot_state_ng/informational_settings.ex rename to lib/core/bot_state_ng/informational_settings.ex index 96c55eaf0..de913ebcb 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng/informational_settings.ex +++ b/lib/core/bot_state_ng/informational_settings.ex @@ -11,7 +11,7 @@ defmodule FarmbotCore.BotStateNG.InformationalSettings do embedded_schema do field(:target, :string, default: to_string(Project.target())) field(:env, :string, default: to_string(Project.env())) - field(:firmware_commit, :string, default: Project.arduino_commit()) + field(:firmware_commit, :string, default: "---") field(:controller_version, :string, default: Project.version()) field(:controller_uuid, :string) field(:controller_commit, :string, default: Project.commit()) diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/location_data.ex b/lib/core/bot_state_ng/location_data.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/bot_state_ng/location_data.ex rename to lib/core/bot_state_ng/location_data.ex diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/location_data/vec3.ex b/lib/core/bot_state_ng/location_data/vec3.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/bot_state_ng/location_data/vec3.ex rename to lib/core/bot_state_ng/location_data/vec3.ex diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/location_data/vec3_string.ex b/lib/core/bot_state_ng/location_data/vec3_string.ex similarity index 99% rename from farmbot_core/lib/farmbot_core/bot_state_ng/location_data/vec3_string.ex rename to lib/core/bot_state_ng/location_data/vec3_string.ex index 50e8ac5f7..2ac147838 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng/location_data/vec3_string.ex +++ b/lib/core/bot_state_ng/location_data/vec3_string.ex @@ -29,4 +29,4 @@ defmodule FarmbotCore.BotStateNG.LocationData.Vec3String do vec3 |> cast(params, [:x, :y, :z]) end -end \ No newline at end of file +end diff --git a/farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex b/lib/core/bot_state_ng/mcu_params.ex similarity index 53% rename from farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex rename to lib/core/bot_state_ng/mcu_params.ex index b724cfae8..5fc22f346 100644 --- a/farmbot_core/lib/farmbot_core/bot_state_ng/mcu_params.ex +++ b/lib/core/bot_state_ng/mcu_params.ex @@ -127,115 +127,119 @@ defmodule FarmbotCore.BotStateNG.McuParams do def view(mcu_params) do %{ - encoder_enabled_x: mcu_params.encoder_enabled_x, - encoder_enabled_y: mcu_params.encoder_enabled_y, - encoder_enabled_z: mcu_params.encoder_enabled_z, - encoder_invert_x: mcu_params.encoder_invert_x, - encoder_invert_y: mcu_params.encoder_invert_y, - encoder_invert_z: mcu_params.encoder_invert_z, - encoder_missed_steps_decay_x: mcu_params.encoder_missed_steps_decay_x, - encoder_missed_steps_decay_y: mcu_params.encoder_missed_steps_decay_y, - encoder_missed_steps_decay_z: mcu_params.encoder_missed_steps_decay_z, - encoder_missed_steps_max_x: mcu_params.encoder_missed_steps_max_x, - encoder_missed_steps_max_y: mcu_params.encoder_missed_steps_max_y, - encoder_missed_steps_max_z: mcu_params.encoder_missed_steps_max_z, - encoder_scaling_x: mcu_params.encoder_scaling_x, - encoder_scaling_y: mcu_params.encoder_scaling_y, - encoder_scaling_z: mcu_params.encoder_scaling_z, - encoder_type_x: mcu_params.encoder_type_x, - encoder_type_y: mcu_params.encoder_type_y, - encoder_type_z: mcu_params.encoder_type_z, - encoder_use_for_pos_x: mcu_params.encoder_use_for_pos_x, - encoder_use_for_pos_y: mcu_params.encoder_use_for_pos_y, - encoder_use_for_pos_z: mcu_params.encoder_use_for_pos_z, - movement_axis_nr_steps_x: mcu_params.movement_axis_nr_steps_x, - movement_axis_nr_steps_y: mcu_params.movement_axis_nr_steps_y, - movement_axis_nr_steps_z: mcu_params.movement_axis_nr_steps_z, - movement_axis_stealth_x: mcu_params.movement_axis_stealth_x, - movement_axis_stealth_y: mcu_params.movement_axis_stealth_y, - movement_axis_stealth_z: mcu_params.movement_axis_stealth_z, - movement_calibration_deadzone_x: mcu_params.movement_calibration_deadzone_x, - movement_calibration_deadzone_y: mcu_params.movement_calibration_deadzone_y, - movement_calibration_deadzone_z: mcu_params.movement_calibration_deadzone_z, - movement_calibration_retry_x: mcu_params.movement_calibration_retry_x, - movement_calibration_retry_y: mcu_params.movement_calibration_retry_y, - movement_calibration_retry_z: mcu_params.movement_calibration_retry_z, - movement_enable_endpoints_x: mcu_params.movement_enable_endpoints_x, - movement_enable_endpoints_y: mcu_params.movement_enable_endpoints_y, - movement_enable_endpoints_z: mcu_params.movement_enable_endpoints_z, - movement_home_at_boot_x: mcu_params.movement_home_at_boot_x, - movement_home_at_boot_y: mcu_params.movement_home_at_boot_y, - movement_home_at_boot_z: mcu_params.movement_home_at_boot_z, - movement_home_spd_x: mcu_params.movement_home_spd_x, - movement_home_spd_y: mcu_params.movement_home_spd_y, - movement_home_spd_z: mcu_params.movement_home_spd_z, - movement_home_up_x: mcu_params.movement_home_up_x, - movement_home_up_y: mcu_params.movement_home_up_y, - movement_home_up_z: mcu_params.movement_home_up_z, - movement_invert_2_endpoints_x: mcu_params.movement_invert_2_endpoints_x, - movement_invert_2_endpoints_y: mcu_params.movement_invert_2_endpoints_y, - movement_invert_2_endpoints_z: mcu_params.movement_invert_2_endpoints_z, - movement_invert_endpoints_x: mcu_params.movement_invert_endpoints_x, - movement_invert_endpoints_y: mcu_params.movement_invert_endpoints_y, - movement_invert_endpoints_z: mcu_params.movement_invert_endpoints_z, - movement_invert_motor_x: mcu_params.movement_invert_motor_x, - movement_invert_motor_y: mcu_params.movement_invert_motor_y, - movement_invert_motor_z: mcu_params.movement_invert_motor_z, - movement_keep_active_x: mcu_params.movement_keep_active_x, - movement_keep_active_y: mcu_params.movement_keep_active_y, - movement_keep_active_z: mcu_params.movement_keep_active_z, - movement_max_spd_x: mcu_params.movement_max_spd_x, - movement_max_spd_y: mcu_params.movement_max_spd_y, - movement_max_spd_z: mcu_params.movement_max_spd_z, - movement_max_spd_z2: mcu_params.movement_max_spd_z2, - movement_microsteps_x: mcu_params.movement_microsteps_x, - movement_microsteps_y: mcu_params.movement_microsteps_y, - movement_microsteps_z: mcu_params.movement_microsteps_z, - movement_min_spd_x: mcu_params.movement_min_spd_x, - movement_min_spd_y: mcu_params.movement_min_spd_y, - movement_min_spd_z: mcu_params.movement_min_spd_z, - movement_min_spd_z2: mcu_params.movement_min_spd_z2, - movement_motor_current_x: mcu_params.movement_motor_current_x, - movement_motor_current_y: mcu_params.movement_motor_current_y, - movement_motor_current_z: mcu_params.movement_motor_current_z, - movement_secondary_motor_invert_x: mcu_params.movement_secondary_motor_invert_x, - movement_secondary_motor_x: mcu_params.movement_secondary_motor_x, - movement_stall_sensitivity_x: mcu_params.movement_stall_sensitivity_x, - movement_stall_sensitivity_y: mcu_params.movement_stall_sensitivity_y, - movement_stall_sensitivity_z: mcu_params.movement_stall_sensitivity_z, - movement_step_per_mm_x: mcu_params.movement_step_per_mm_x, - movement_step_per_mm_y: mcu_params.movement_step_per_mm_y, - movement_step_per_mm_z: mcu_params.movement_step_per_mm_z, - movement_steps_acc_dec_x: mcu_params.movement_steps_acc_dec_x, - movement_steps_acc_dec_y: mcu_params.movement_steps_acc_dec_y, - movement_steps_acc_dec_z: mcu_params.movement_steps_acc_dec_z, - movement_steps_acc_dec_z2: mcu_params.movement_steps_acc_dec_z2, - movement_stop_at_home_x: mcu_params.movement_stop_at_home_x, - movement_stop_at_home_y: mcu_params.movement_stop_at_home_y, - movement_stop_at_home_z: mcu_params.movement_stop_at_home_z, - movement_stop_at_max_x: mcu_params.movement_stop_at_max_x, - movement_stop_at_max_y: mcu_params.movement_stop_at_max_y, - movement_stop_at_max_z: mcu_params.movement_stop_at_max_z, - movement_timeout_x: mcu_params.movement_timeout_x, - movement_timeout_y: mcu_params.movement_timeout_y, - movement_timeout_z: mcu_params.movement_timeout_z, - param_e_stop_on_mov_err: mcu_params.param_e_stop_on_mov_err, - param_mov_nr_retry: mcu_params.param_mov_nr_retry, - pin_guard_1_active_state: mcu_params.pin_guard_1_active_state, - pin_guard_1_pin_nr: mcu_params.pin_guard_1_pin_nr, - pin_guard_1_time_out: mcu_params.pin_guard_1_time_out, - pin_guard_2_active_state: mcu_params.pin_guard_2_active_state, - pin_guard_2_pin_nr: mcu_params.pin_guard_2_pin_nr, - pin_guard_2_time_out: mcu_params.pin_guard_2_time_out, - pin_guard_3_active_state: mcu_params.pin_guard_3_active_state, - pin_guard_3_pin_nr: mcu_params.pin_guard_3_pin_nr, - pin_guard_3_time_out: mcu_params.pin_guard_3_time_out, - pin_guard_4_active_state: mcu_params.pin_guard_4_active_state, - pin_guard_4_pin_nr: mcu_params.pin_guard_4_pin_nr, - pin_guard_4_time_out: mcu_params.pin_guard_4_time_out, - pin_guard_5_active_state: mcu_params.pin_guard_5_active_state, - pin_guard_5_pin_nr: mcu_params.pin_guard_5_pin_nr, - pin_guard_5_time_out: mcu_params.pin_guard_5_time_out, + encoder_enabled_x: mcu_params.encoder_enabled_x, + encoder_enabled_y: mcu_params.encoder_enabled_y, + encoder_enabled_z: mcu_params.encoder_enabled_z, + encoder_invert_x: mcu_params.encoder_invert_x, + encoder_invert_y: mcu_params.encoder_invert_y, + encoder_invert_z: mcu_params.encoder_invert_z, + encoder_missed_steps_decay_x: mcu_params.encoder_missed_steps_decay_x, + encoder_missed_steps_decay_y: mcu_params.encoder_missed_steps_decay_y, + encoder_missed_steps_decay_z: mcu_params.encoder_missed_steps_decay_z, + encoder_missed_steps_max_x: mcu_params.encoder_missed_steps_max_x, + encoder_missed_steps_max_y: mcu_params.encoder_missed_steps_max_y, + encoder_missed_steps_max_z: mcu_params.encoder_missed_steps_max_z, + encoder_scaling_x: mcu_params.encoder_scaling_x, + encoder_scaling_y: mcu_params.encoder_scaling_y, + encoder_scaling_z: mcu_params.encoder_scaling_z, + encoder_type_x: mcu_params.encoder_type_x, + encoder_type_y: mcu_params.encoder_type_y, + encoder_type_z: mcu_params.encoder_type_z, + encoder_use_for_pos_x: mcu_params.encoder_use_for_pos_x, + encoder_use_for_pos_y: mcu_params.encoder_use_for_pos_y, + encoder_use_for_pos_z: mcu_params.encoder_use_for_pos_z, + movement_axis_nr_steps_x: mcu_params.movement_axis_nr_steps_x, + movement_axis_nr_steps_y: mcu_params.movement_axis_nr_steps_y, + movement_axis_nr_steps_z: mcu_params.movement_axis_nr_steps_z, + movement_axis_stealth_x: mcu_params.movement_axis_stealth_x, + movement_axis_stealth_y: mcu_params.movement_axis_stealth_y, + movement_axis_stealth_z: mcu_params.movement_axis_stealth_z, + movement_calibration_deadzone_x: + mcu_params.movement_calibration_deadzone_x, + movement_calibration_deadzone_y: + mcu_params.movement_calibration_deadzone_y, + movement_calibration_deadzone_z: + mcu_params.movement_calibration_deadzone_z, + movement_calibration_retry_x: mcu_params.movement_calibration_retry_x, + movement_calibration_retry_y: mcu_params.movement_calibration_retry_y, + movement_calibration_retry_z: mcu_params.movement_calibration_retry_z, + movement_enable_endpoints_x: mcu_params.movement_enable_endpoints_x, + movement_enable_endpoints_y: mcu_params.movement_enable_endpoints_y, + movement_enable_endpoints_z: mcu_params.movement_enable_endpoints_z, + movement_home_at_boot_x: mcu_params.movement_home_at_boot_x, + movement_home_at_boot_y: mcu_params.movement_home_at_boot_y, + movement_home_at_boot_z: mcu_params.movement_home_at_boot_z, + movement_home_spd_x: mcu_params.movement_home_spd_x, + movement_home_spd_y: mcu_params.movement_home_spd_y, + movement_home_spd_z: mcu_params.movement_home_spd_z, + movement_home_up_x: mcu_params.movement_home_up_x, + movement_home_up_y: mcu_params.movement_home_up_y, + movement_home_up_z: mcu_params.movement_home_up_z, + movement_invert_2_endpoints_x: mcu_params.movement_invert_2_endpoints_x, + movement_invert_2_endpoints_y: mcu_params.movement_invert_2_endpoints_y, + movement_invert_2_endpoints_z: mcu_params.movement_invert_2_endpoints_z, + movement_invert_endpoints_x: mcu_params.movement_invert_endpoints_x, + movement_invert_endpoints_y: mcu_params.movement_invert_endpoints_y, + movement_invert_endpoints_z: mcu_params.movement_invert_endpoints_z, + movement_invert_motor_x: mcu_params.movement_invert_motor_x, + movement_invert_motor_y: mcu_params.movement_invert_motor_y, + movement_invert_motor_z: mcu_params.movement_invert_motor_z, + movement_keep_active_x: mcu_params.movement_keep_active_x, + movement_keep_active_y: mcu_params.movement_keep_active_y, + movement_keep_active_z: mcu_params.movement_keep_active_z, + movement_max_spd_x: mcu_params.movement_max_spd_x, + movement_max_spd_y: mcu_params.movement_max_spd_y, + movement_max_spd_z: mcu_params.movement_max_spd_z, + movement_max_spd_z2: mcu_params.movement_max_spd_z2, + movement_microsteps_x: mcu_params.movement_microsteps_x, + movement_microsteps_y: mcu_params.movement_microsteps_y, + movement_microsteps_z: mcu_params.movement_microsteps_z, + movement_min_spd_x: mcu_params.movement_min_spd_x, + movement_min_spd_y: mcu_params.movement_min_spd_y, + movement_min_spd_z: mcu_params.movement_min_spd_z, + movement_min_spd_z2: mcu_params.movement_min_spd_z2, + movement_motor_current_x: mcu_params.movement_motor_current_x, + movement_motor_current_y: mcu_params.movement_motor_current_y, + movement_motor_current_z: mcu_params.movement_motor_current_z, + movement_secondary_motor_invert_x: + mcu_params.movement_secondary_motor_invert_x, + movement_secondary_motor_x: mcu_params.movement_secondary_motor_x, + movement_stall_sensitivity_x: mcu_params.movement_stall_sensitivity_x, + movement_stall_sensitivity_y: mcu_params.movement_stall_sensitivity_y, + movement_stall_sensitivity_z: mcu_params.movement_stall_sensitivity_z, + movement_step_per_mm_x: mcu_params.movement_step_per_mm_x, + movement_step_per_mm_y: mcu_params.movement_step_per_mm_y, + movement_step_per_mm_z: mcu_params.movement_step_per_mm_z, + movement_steps_acc_dec_x: mcu_params.movement_steps_acc_dec_x, + movement_steps_acc_dec_y: mcu_params.movement_steps_acc_dec_y, + movement_steps_acc_dec_z: mcu_params.movement_steps_acc_dec_z, + movement_steps_acc_dec_z2: mcu_params.movement_steps_acc_dec_z2, + movement_stop_at_home_x: mcu_params.movement_stop_at_home_x, + movement_stop_at_home_y: mcu_params.movement_stop_at_home_y, + movement_stop_at_home_z: mcu_params.movement_stop_at_home_z, + movement_stop_at_max_x: mcu_params.movement_stop_at_max_x, + movement_stop_at_max_y: mcu_params.movement_stop_at_max_y, + movement_stop_at_max_z: mcu_params.movement_stop_at_max_z, + movement_timeout_x: mcu_params.movement_timeout_x, + movement_timeout_y: mcu_params.movement_timeout_y, + movement_timeout_z: mcu_params.movement_timeout_z, + param_e_stop_on_mov_err: mcu_params.param_e_stop_on_mov_err, + param_mov_nr_retry: mcu_params.param_mov_nr_retry, + pin_guard_1_active_state: mcu_params.pin_guard_1_active_state, + pin_guard_1_pin_nr: mcu_params.pin_guard_1_pin_nr, + pin_guard_1_time_out: mcu_params.pin_guard_1_time_out, + pin_guard_2_active_state: mcu_params.pin_guard_2_active_state, + pin_guard_2_pin_nr: mcu_params.pin_guard_2_pin_nr, + pin_guard_2_time_out: mcu_params.pin_guard_2_time_out, + pin_guard_3_active_state: mcu_params.pin_guard_3_active_state, + pin_guard_3_pin_nr: mcu_params.pin_guard_3_pin_nr, + pin_guard_3_time_out: mcu_params.pin_guard_3_time_out, + pin_guard_4_active_state: mcu_params.pin_guard_4_active_state, + pin_guard_4_pin_nr: mcu_params.pin_guard_4_pin_nr, + pin_guard_4_time_out: mcu_params.pin_guard_4_time_out, + pin_guard_5_active_state: mcu_params.pin_guard_5_active_state, + pin_guard_5_pin_nr: mcu_params.pin_guard_5_pin_nr, + pin_guard_5_time_out: mcu_params.pin_guard_5_time_out } end @@ -350,7 +354,7 @@ defmodule FarmbotCore.BotStateNG.McuParams do :pin_guard_4_time_out, :pin_guard_5_active_state, :pin_guard_5_pin_nr, - :pin_guard_5_time_out, + :pin_guard_5_time_out ]) end end diff --git a/farmbot_core/lib/farmbot_core/calendar.ex b/lib/core/calendar.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/calendar.ex rename to lib/core/calendar.ex diff --git a/farmbot_core/lib/farmbot_core/asset_supervisor.ex b/lib/core/change_supervisor.ex similarity index 95% rename from farmbot_core/lib/farmbot_core/asset_supervisor.ex rename to lib/core/change_supervisor.ex index 0e65ea94d..5df0dc503 100644 --- a/farmbot_core/lib/farmbot_core/asset_supervisor.ex +++ b/lib/core/change_supervisor.ex @@ -1,4 +1,4 @@ -defmodule FarmbotCore.AssetSupervisor do +defmodule FarmbotCore.ChangeSupervisor do @moduledoc """ Supervises all database-backed records. """ @@ -89,7 +89,10 @@ defmodule FarmbotCore.AssetSupervisor do @doc false def start_link(args) when is_list(args) do module = Keyword.fetch!(args, :module) - Supervisor.start_link(__MODULE__, args, name: Module.concat(__MODULE__, module)) + + Supervisor.start_link(__MODULE__, args, + name: Module.concat(__MODULE__, module) + ) end @doc false diff --git a/farmbot_core/lib/farmbot_core/config_storage/bool_value.ex b/lib/core/config_storage/bool_value.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/config_storage/bool_value.ex rename to lib/core/config_storage/bool_value.ex diff --git a/farmbot_core/lib/farmbot_core/config_storage/config.ex b/lib/core/config_storage/config.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/config_storage/config.ex rename to lib/core/config_storage/config.ex diff --git a/farmbot_core/lib/farmbot_core/config_storage/config_storage.ex b/lib/core/config_storage/config_storage.ex similarity index 73% rename from farmbot_core/lib/farmbot_core/config_storage/config_storage.ex rename to lib/core/config_storage/config_storage.ex index 80cba6a22..bc1146829 100644 --- a/farmbot_core/lib/farmbot_core/config_storage/config_storage.ex +++ b/lib/core/config_storage/config_storage.ex @@ -1,13 +1,14 @@ defmodule FarmbotCore.Config do @moduledoc "API for accessing config data." + alias FarmbotCore.Asset.Repo + alias FarmbotCore.Config.{ BoolValue, Config, FloatValue, Group, NetworkInterface, - Repo, StringValue } @@ -16,6 +17,7 @@ defmodule FarmbotCore.Config do @doc "Input a network config. Takes many settings as a map." def input_network_config!(%{} = config) do _ = destroy_all_network_configs() + %NetworkInterface{} |> NetworkInterface.changeset(config) |> Repo.insert!() @@ -38,7 +40,9 @@ defmodule FarmbotCore.Config do groups = from(g in Group, select: g) |> Repo.all() Map.new(groups, fn group -> - vals = from(b in Config, where: b.group_id == ^group.id, select: b) |> Repo.all() + vals = + from(b in Config, where: b.group_id == ^group.id, select: b) + |> Repo.all() s = Map.new(vals, fn val -> @@ -46,13 +50,19 @@ defmodule FarmbotCore.Config do Enum.find_value(val |> Map.from_struct(), fn {_key, _val} = f -> case f do {:bool_value_id, id} when is_number(id) -> - Repo.all(from(v in BoolValue, where: v.id == ^id, select: v.value)) + Repo.all( + from(v in BoolValue, where: v.id == ^id, select: v.value) + ) {:float_value_id, id} when is_number(id) -> - Repo.all(from(v in FloatValue, where: v.id == ^id, select: v.value)) + Repo.all( + from(v in FloatValue, where: v.id == ^id, select: v.value) + ) {:string_value_id, id} when is_number(id) -> - Repo.all(from(v in StringValue, where: v.id == ^id, select: v.value)) + Repo.all( + from(v in StringValue, where: v.id == ^id, select: v.value) + ) _ -> false @@ -68,6 +78,7 @@ defmodule FarmbotCore.Config do def get_config_value(:string, "authorization", key_name) do env = System.get_env("FARMBOT_#{String.upcase(key_name)}") + if env && env != "" do env else @@ -77,7 +88,8 @@ defmodule FarmbotCore.Config do end end - def get_config_value(type, group_name, key_name) when type in [:bool, :float, :string] do + def get_config_value(type, group_name, key_name) + when type in [:bool, :float, :string] do __MODULE__ |> apply(:"get_#{type}_value", [group_name, key_name]) |> Map.fetch!(:value) @@ -87,7 +99,8 @@ defmodule FarmbotCore.Config do raise "Unsupported type: #{type}" end - def update_config_value(type, group_name, key_name, value) when type in [:bool, :float, :string] do + def update_config_value(type, group_name, key_name, value) + when type in [:bool, :float, :string] do __MODULE__ |> apply(:"get_#{type}_value", [group_name, key_name]) |> Ecto.Changeset.change(value: value) @@ -108,7 +121,9 @@ defmodule FarmbotCore.Config do ) |> Repo.all() do [type_id] -> - [val] = from(v in BoolValue, where: v.id == ^type_id, select: v) |> Repo.all() + [val] = + from(v in BoolValue, where: v.id == ^type_id, select: v) |> Repo.all() + val [] -> @@ -127,12 +142,15 @@ defmodule FarmbotCore.Config do ) |> Repo.all() - [val] = from(v in FloatValue, where: v.id == ^type_id, select: v) |> Repo.all() + [val] = + from(v in FloatValue, where: v.id == ^type_id, select: v) |> Repo.all() + val end def get_string_value(group_name, key_name) do group_id = get_group_id(group_name) + [type_id] = from( c in Config, @@ -141,12 +159,17 @@ defmodule FarmbotCore.Config do ) |> Repo.all() - [val] = from(v in StringValue, where: v.id == ^type_id, select: v) |> Repo.all() + [val] = + from(v in StringValue, where: v.id == ^type_id, select: v) |> Repo.all() + val end defp get_group_id(group_name) do - [group_id] = from(g in Group, where: g.group_name == ^group_name, select: g.id) |> Repo.all() + [group_id] = + from(g in Group, where: g.group_name == ^group_name, select: g.id) + |> Repo.all() + group_id end end diff --git a/farmbot_core/lib/farmbot_core/config_storage/float_value.ex b/lib/core/config_storage/float_value.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/config_storage/float_value.ex rename to lib/core/config_storage/float_value.ex diff --git a/farmbot_core/lib/farmbot_core/config_storage/group.ex b/lib/core/config_storage/group.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/config_storage/group.ex rename to lib/core/config_storage/group.ex diff --git a/farmbot_core/lib/farmbot_core/config_storage/network_interface.ex b/lib/core/config_storage/network_interface.ex similarity index 74% rename from farmbot_core/lib/farmbot_core/config_storage/network_interface.ex rename to lib/core/config_storage/network_interface.ex index 8b7c8a457..cfbecfc87 100644 --- a/farmbot_core/lib/farmbot_core/config_storage/network_interface.ex +++ b/lib/core/config_storage/network_interface.ex @@ -35,19 +35,24 @@ defmodule FarmbotCore.Config.NetworkInterface do def changeset(config, params \\ %{}) do config - |> cast(params, @required_fields ++ [:ssid, - :psk, - :security, - :identity, - :password, - :ipv4_method, - :ipv4_address, - :ipv4_gateway, - :ipv4_subnet_mask, - :domain, - :name_servers, - :regulatory_domain - ]) + |> cast( + params, + @required_fields ++ + [ + :ssid, + :psk, + :security, + :identity, + :password, + :ipv4_method, + :ipv4_address, + :ipv4_gateway, + :ipv4_subnet_mask, + :domain, + :name_servers, + :regulatory_domain + ] + ) |> validate_required(@required_fields) |> validate_inclusion(:type, ["wireless", "wired"]) |> unique_constraint(:name) diff --git a/farmbot_core/lib/farmbot_core/config_storage/string_value.ex b/lib/core/config_storage/string_value.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/config_storage/string_value.ex rename to lib/core/config_storage/string_value.ex diff --git a/farmbot_core/lib/farmbot_core/farmware_runtime.ex b/lib/core/farmware_runtime.ex similarity index 88% rename from farmbot_core/lib/farmbot_core/farmware_runtime.ex rename to lib/core/farmware_runtime.ex index 3bf1fe449..2fee07c17 100644 --- a/farmbot_core/lib/farmbot_core/farmware_runtime.ex +++ b/lib/core/farmware_runtime.ex @@ -10,11 +10,11 @@ defmodule FarmbotCore.FarmwareLogger do def into(%S{} = logger), do: {logger, &collector/2} defp collector(%S{} = logger, :done), do: logger defp collector(%S{} = _, :halt), do: :ok + defp collector(%S{} = logger, {:cont, text}) do Logger.debug("[#{inspect(logger.name)}] " <> text) logger end - end end @@ -38,7 +38,7 @@ defmodule FarmbotCore.FarmwareRuntime do @error_timeout_ms 5000 @runtime_dir "/tmp/farmware_runtime" - @muontrap_opts Application.get_env(:farmbot_core, __MODULE__)[:muontrap_opts] + @muontrap_opts Application.get_env(:farmbot, __MODULE__)[:muontrap_opts] @muontrap_opts @muontrap_opts || [] @packet_header_token 0xFBFB @@ -71,13 +71,21 @@ defmodule FarmbotCore.FarmwareRuntime do cmd: pid(), mon: pid() | nil, rpc: map(), - context: :get_header | :get_payload | :process_payload | :send_response | :error + context: + :get_header + | :get_payload + | :process_payload + | :send_response + | :error } @doc "Start a Farmware" def start_link(%Manifest{} = manifest, env \\ %{}) do package = manifest.package - GenServer.start_link(__MODULE__, [manifest, env, self()], name: String.to_atom(package)) + + GenServer.start_link(__MODULE__, [manifest, env, self()], + name: String.to_atom(package) + ) end @doc "Stop a farmware" @@ -127,7 +135,12 @@ defmodule FarmbotCore.FarmwareRuntime do # Start the plugin. Logger.debug("spawning farmware: #{exec} #{manifest.args}") - {cmd, _} = spawn_monitor(MuonTrap, :cmd, ["sh", ["-c", "#{exec} #{manifest.args}"], opts]) + {cmd, _} = + spawn_monitor(MuonTrap, :cmd, [ + "sh", + ["-c", "#{exec} #{manifest.args}"], + opts + ]) state = %State{ caller: caller, @@ -147,7 +160,8 @@ defmodule FarmbotCore.FarmwareRuntime do end def terminate(_reason, state) do - if state.cmd && Process.alive?(state.cmd), do: Process.exit(state.cmd, :kill) + if state.cmd && Process.alive?(state.cmd), + do: Process.exit(state.cmd, :kill) if state.request_pipe_handle do PipeWorker.close(state.request_pipe_handle) @@ -163,7 +177,10 @@ defmodule FarmbotCore.FarmwareRuntime do {:noreply, state} end - def handle_info({:csvm_done, ref, {:error, reason}}, %{scheduler_ref: ref} = state) do + def handle_info( + {:csvm_done, ref, {:error, reason}}, + %{scheduler_ref: ref} = state + ) do send(state.caller, {:error, reason}) {:noreply, %{state | scheduler_ref: nil, context: :error}} end @@ -195,7 +212,10 @@ defmodule FarmbotCore.FarmwareRuntime do end # farmware exit - def handle_info({:DOWN, _ref, :process, _pid, _reason}, %{cmd: _cmd_pid} = state) do + def handle_info( + {:DOWN, _ref, :process, _pid, _reason}, + %{cmd: _cmd_pid} = state + ) do Logger.debug("Farmware exit") send(state.caller, {:error, :farmware_exit}) {:noreply, %{state | context: :error}} @@ -214,7 +234,10 @@ defmodule FarmbotCore.FarmwareRuntime do end # error result of an io:read/2 in :get_header context - def handle_info({PipeWorker, _ref, {:ok, data}}, %{context: :get_header} = state) do + def handle_info( + {PipeWorker, _ref, {:ok, data}}, + %{context: :get_header} = state + ) do Logger.error("Bad header: #{inspect(data, base: :hex, limit: :infinity)}") send(state.caller, {:error, {:unhandled_packet, data}}) {:noreply, %{state | context: :error}} @@ -228,7 +251,10 @@ defmodule FarmbotCore.FarmwareRuntime do end # successful result of an io:read/2 in :get_payload context - def handle_info({PipeWorker, _ref, {:ok, packet}}, %{context: :get_payload} = state) do + def handle_info( + {PipeWorker, _ref, {:ok, packet}}, + %{context: :get_payload} = state + ) do handle_packet(packet, state) end @@ -264,7 +290,8 @@ defmodule FarmbotCore.FarmwareRuntime do # todo(connor) replace this with StepRunner? FarmbotCore.Celery.execute(rpc, ref) - {:noreply, %{state | rpc: rpc, scheduler_ref: ref, context: :process_request}, + {:noreply, + %{state | rpc: rpc, scheduler_ref: ref, context: :process_request}, @error_timeout_ms} else {:error, reason} -> @@ -294,7 +321,7 @@ defmodule FarmbotCore.FarmwareRuntime do token = get_config_value(:string, "authorization", "token") images_dir = "/tmp/images" installation_path = install_dir(manifest) - state_root_dir = Application.get_env(:farmbot_core, FileSystem)[:root_dir] + state_root_dir = Application.get_env(:farmbot, FileSystem)[:root_dir] base = Map.new() diff --git a/farmbot_core/lib/farmbot_core/farmware_runtime/pipe_worker.ex b/lib/core/farmware_runtime/pipe_worker.ex similarity index 64% rename from farmbot_core/lib/farmbot_core/farmware_runtime/pipe_worker.ex rename to lib/core/farmware_runtime/pipe_worker.ex index 049a88a17..d5631f726 100644 --- a/farmbot_core/lib/farmbot_core/farmware_runtime/pipe_worker.ex +++ b/lib/core/farmware_runtime/pipe_worker.ex @@ -5,6 +5,7 @@ defmodule FarmbotCore.FarmwareRuntime.PipeWorker do use GenServer require Logger alias __MODULE__, as: State + defstruct [ :port, :pipe_name, @@ -35,17 +36,26 @@ defmodule FarmbotCore.FarmwareRuntime.PipeWorker do end def init([pipe_name, direction]) do - Logger.debug "opening pipe: #{pipe_name}" - {:ok, port} = :gen_tcp.listen(0, [ - {:ip, {:local, to_charlist(pipe_name)}}, - {:ifaddr, {:local, to_charlist(pipe_name)}}, - :local, - {:active, true}, - :binary - ]) - send self(), :accept + Logger.debug("opening pipe: #{pipe_name}") + + {:ok, port} = + :gen_tcp.listen(0, [ + {:ip, {:local, to_charlist(pipe_name)}}, + {:ifaddr, {:local, to_charlist(pipe_name)}}, + :local, + {:active, true}, + :binary + ]) + + send(self(), :accept) # {:ok, pipe} = :gen_tcp.accept(lsocket) - {:ok, %State{pipe_name: pipe_name, port: port, buffer: <<>>, direction: direction}} + {:ok, + %State{ + pipe_name: pipe_name, + port: port, + buffer: <<>>, + direction: direction + }} end def terminate(_, state) do @@ -56,69 +66,87 @@ defmodule FarmbotCore.FarmwareRuntime.PipeWorker do end def handle_call({:write, packet}, _from, state) do - Logger.debug "#{state.direction} writing #{byte_size(packet)} bytes" + Logger.debug("#{state.direction} writing #{byte_size(packet)} bytes") + if state.pipe do :ok = :gen_tcp.send(state.pipe, packet) else - Logger.warn "no pipe" + Logger.warn("no pipe") end + # reply = :erlang.port_command(state.pipe, packet) {:reply, true, state} end - def handle_call({:read, amnt}, {_pid, ref} = from, %{caller: nil, size: nil} = state) do - Logger.debug "#{state.direction} requesting: #{amnt} bytes" + def handle_call( + {:read, amnt}, + {_pid, ref} = from, + %{caller: nil, size: nil} = state + ) do + Logger.debug("#{state.direction} requesting: #{amnt} bytes") Process.send_after(self(), {:read, amnt, from}, @read_time) # timeout_timer = Process.send_after(self(), {:timeout, amnt, from}, 5000) timeout_timer = nil - {:reply, ref, %{state | caller: from, size: amnt, timeout_timer: timeout_timer}} + + {:reply, ref, + %{state | caller: from, size: amnt, timeout_timer: timeout_timer}} end def handle_info({:tcp_closed, _port}, state) do - send self(), :accept + send(self(), :accept) {:noreply, %{state | pipe: nil}} end - + def handle_info(:accept, state) do case :gen_tcp.accept(state.port, 100) do {:ok, pipe} -> {:noreply, %{state | pipe: pipe}} + {:error, :timeout} -> - send self(), :accept + send(self(), :accept) {:noreply, %{state | pipe: nil}} end end def handle_info({:timeout, size, {pid, ref}}, %{caller: {pid, ref}} = state) do - Logger.error "#{state.direction} Timed out waiting on #{size} bytes." + Logger.error("#{state.direction} Timed out waiting on #{size} bytes.") {:stop, :timeout, state} end def handle_info({:timeout, _size, _caller}, state) do - Logger.warn "stray timeout" + Logger.warn("stray timeout") {:noreply, state} end # {udp,#Port<0.676>,{127,0,0,1},8790,<<"hey there!">>} # def handle_info({pipe, {:data, data}}, %{pipe: pipe, buffer: buffer} = state) do def handle_info({:tcp, pipe, data}, %{pipe: pipe, buffer: buffer} = state) do - Logger.debug "#{state.direction} buffering #{byte_size(data)} bytes" + Logger.debug("#{state.direction} buffering #{byte_size(data)} bytes") {:noreply, %{state | buffer: buffer <> data}} end - def handle_info({:read, size, caller}, %{buffer: buffer} = state) when byte_size(buffer) >= size do + def handle_info({:read, size, caller}, %{buffer: buffer} = state) + when byte_size(buffer) >= size do _ = state.timeout_timer && Process.cancel_timer(state.timeout_timer) {pid, ref} = caller {resp, buffer} = String.split_at(buffer, size) send(pid, {__MODULE__, ref, {:ok, resp}}) - Logger.debug "#{state.direction} pipe worker read #{size} bytes successfully #{byte_size(buffer)} bytes remaining in buffer." + + Logger.debug( + "#{state.direction} pipe worker read #{size} bytes successfully #{byte_size(buffer)} bytes remaining in buffer." + ) + {:noreply, %{state | buffer: buffer, size: nil, caller: nil}} end - def handle_info({:read, size, caller}, %{buffer: buffer} = state) when byte_size(buffer) < size do + def handle_info({:read, size, caller}, %{buffer: buffer} = state) + when byte_size(buffer) < size do if byte_size(buffer) != 0 do - Logger.debug "#{state.direction} pipe worker still waiting on #{size - byte_size(buffer)} bytes for #{inspect(caller)} Currently #{byte_size(buffer)} bytes in buffer" + Logger.debug( + "#{state.direction} pipe worker still waiting on #{size - byte_size(buffer)} bytes for #{inspect(caller)} Currently #{byte_size(buffer)} bytes in buffer" + ) end + Process.send_after(self(), {:read, size, caller}, @read_time) {:noreply, state} end diff --git a/farmbot_core/lib/farmbot_core/firmware_estop_timer.ex b/lib/core/firmware_estop_timer.ex similarity index 90% rename from farmbot_core/lib/farmbot_core/firmware_estop_timer.ex rename to lib/core/firmware_estop_timer.ex index e2f63fc30..25381f93c 100644 --- a/farmbot_core/lib/farmbot_core/firmware_estop_timer.ex +++ b/lib/core/firmware_estop_timer.ex @@ -9,9 +9,10 @@ defmodule FarmbotCore.FirmwareEstopTimer do require FarmbotCore.Logger @msg "Farmbot has been E-Stopped for more than 10 minutes." - @ten_minutes_ms 60_0000 + alias FarmbotCore.Firmware.UARTCoreSupport + def start_timer(timer_server \\ __MODULE__) do GenServer.call(timer_server, :start_timer) end @@ -54,5 +55,9 @@ defmodule FarmbotCore.FirmwareEstopTimer do end @doc false - def do_log, do: FarmbotCore.Logger.warn(1, @msg, channels: [:fatal_email]) + def do_log do + if UARTCoreSupport.locked?() do + FarmbotCore.Logger.warn(1, @msg, channels: [:fatal_email]) + end + end end diff --git a/farmbot_core/lib/farmbot_core/json.ex b/lib/core/json.ex similarity index 90% rename from farmbot_core/lib/farmbot_core/json.ex rename to lib/core/json.ex index 14436e5e3..2fba44bbd 100644 --- a/farmbot_core/lib/farmbot_core/json.ex +++ b/lib/core/json.ex @@ -10,14 +10,14 @@ defmodule FarmbotCore.JSON do def decode!(iodata, opts \\ []) do case decode(iodata, opts) do - {:ok, results} -> results + {:ok, results} -> results {:error, reason} -> raise(reason) end end def encode!(data, opts \\ []) do case encode(data, opts) do - {:ok, results} -> results + {:ok, results} -> results {:error, reason} -> raise(reason) end end diff --git a/farmbot_core/lib/farmbot_core/json/jason_parser.ex b/lib/core/json/jason_parser.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/json/jason_parser.ex rename to lib/core/json/jason_parser.ex diff --git a/farmbot_core/lib/farmbot_core/json/parser.ex b/lib/core/json/parser.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/json/parser.ex rename to lib/core/json/parser.ex diff --git a/farmbot_core/lib/farmbot_core/leds/led_handler.ex b/lib/core/leds/led_handler.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/leds/led_handler.ex rename to lib/core/leds/led_handler.ex diff --git a/lib/core/leds/leds.ex b/lib/core/leds/leds.ex new file mode 100644 index 000000000..fb43c3aa0 --- /dev/null +++ b/lib/core/leds/leds.ex @@ -0,0 +1,42 @@ +defmodule FarmbotCore.Leds do + @moduledoc "API for controling Farmbot LEDS." + + @valid_status [:off, :solid, :slow_blink, :fast_blink, :really_fast_blink] + + def red(status) when status in @valid_status, do: led_handler().red(status) + def blue(status) when status in @valid_status, do: led_handler().blue(status) + + def green(status) when status in @valid_status, + do: led_handler().green(status) + + def yellow(status) when status in @valid_status, + do: led_handler().yellow(status) + + def white1(status) when status in @valid_status, + do: led_handler().white1(status) + + def white2(status) when status in @valid_status, + do: led_handler().white2(status) + + def white3(status) when status in @valid_status, + do: led_handler().white3(status) + + def white4(status) when status in @valid_status, + do: led_handler().white4(status) + + def white5(status) when status in @valid_status, + do: led_handler().white5(status) + + def led_handler, + do: Application.get_env(:farmbot, __MODULE__)[:gpio_handler] + + def child_spec(opts) do + %{ + id: __MODULE__, + start: {led_handler(), :start_link, [opts]}, + type: :worker, + restart: :permanent, + shutdown: 500 + } + end +end diff --git a/farmbot_core/lib/farmbot_core/leds/stub_handler.ex b/lib/core/leds/stub_handler.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/leds/stub_handler.ex rename to lib/core/leds/stub_handler.ex diff --git a/farmbot_core/lib/farmbot_core/log_storage/log.ex b/lib/core/log_storage/log.ex similarity index 79% rename from farmbot_core/lib/farmbot_core/log_storage/log.ex rename to lib/core/log_storage/log.ex index e78633625..ec3eeae0d 100644 --- a/farmbot_core/lib/farmbot_core/log_storage/log.ex +++ b/lib/core/log_storage/log.ex @@ -6,8 +6,26 @@ defmodule FarmbotCore.Log do defmodule LogLevelType do @moduledoc false - @level_atoms [:debug, :info, :error, :warn, :busy, :success, :fun, :assertion] - @level_strs ["debug", "info", "error", "warn", "busy", "success", "fun", "assertion"] + @level_atoms [ + :debug, + :info, + :error, + :warn, + :busy, + :success, + :fun, + :assertion + ] + @level_strs [ + "debug", + "info", + "error", + "warn", + "busy", + "success", + "fun", + "assertion" + ] def type, do: :string @@ -17,6 +35,7 @@ defmodule FarmbotCore.Log do def load(str), do: {:ok, String.to_existing_atom(str)} def dump(str), do: {:ok, to_string(str)} + def equal?(left, right), do: left == right end defmodule VersionType do @@ -29,6 +48,7 @@ defmodule FarmbotCore.Log do def load(str), do: Version.parse(str) def dump(str), do: {:ok, to_string(str)} + def equal?(left, right), do: left == right end defmodule AtomType do @@ -41,6 +61,7 @@ defmodule FarmbotCore.Log do def load(str), do: {:ok, String.to_atom(str)} def dump(str), do: {:ok, to_string(str)} + def equal?(left, right), do: left == right end use Ecto.Schema @@ -66,7 +87,17 @@ defmodule FarmbotCore.Log do end @required_fields [:level, :verbosity, :message] - @optional_fields [:meta, :function, :file, :line, :module, :id, :inserted_at, :updated_at, :duplicates] + @optional_fields [ + :meta, + :function, + :file, + :line, + :module, + :id, + :inserted_at, + :updated_at, + :duplicates + ] def changeset(log, params \\ %{}) do log diff --git a/farmbot_core/lib/farmbot_core/log_storage/log_executor.ex b/lib/core/log_storage/log_executor.ex similarity index 99% rename from farmbot_core/lib/farmbot_core/log_storage/log_executor.ex rename to lib/core/log_storage/log_executor.ex index 65ad4d4fa..70e6a221b 100644 --- a/farmbot_core/lib/farmbot_core/log_storage/log_executor.ex +++ b/lib/core/log_storage/log_executor.ex @@ -26,6 +26,7 @@ defmodule FarmbotCore.LogExecutor do unless System.get_env("LOG_SILENCE") do Elixir.Logger.bare_log(logger_level, log.message, logger_meta) end + log end end diff --git a/farmbot_core/lib/farmbot_core/log_storage/logger.ex b/lib/core/log_storage/logger.ex similarity index 65% rename from farmbot_core/lib/farmbot_core/log_storage/logger.ex rename to lib/core/log_storage/logger.ex index 10b55f242..c7b4f073b 100644 --- a/farmbot_core/lib/farmbot_core/log_storage/logger.ex +++ b/lib/core/log_storage/logger.ex @@ -4,57 +4,57 @@ defmodule FarmbotCore.Logger do """ require Logger - alias FarmbotCore.{Log, Logger.Repo} + alias FarmbotCore.{Log, Asset.Repo} import Ecto.Query @log_types [:info, :debug, :busy, :warn, :success, :error, :fun, :assertion] @doc "Send a debug message to log endpoints" - defmacro debug(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :debug, verbosity, message, meta) - end + def debug(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:debug, verbosity, message, meta) + # end end @doc "Send an info message to log endpoints" - defmacro info(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :info, verbosity, message, meta) - end + def info(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:info, verbosity, message, meta) + # end end @doc "Send an busy message to log endpoints" - defmacro busy(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :busy, verbosity, message, meta) - end + def busy(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:busy, verbosity, message, meta) + # end end @doc "Send an success message to log endpoints" - defmacro success(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :success, verbosity, message, meta) - end + def success(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:success, verbosity, message, meta) + # end end @doc "Send an warn message to log endpoints" - defmacro warn(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :warn, verbosity, message, meta) - end + def warn(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:warn, verbosity, message, meta) + # end end @doc "Send an error message to log endpoints" - defmacro error(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :error, verbosity, message, meta) - end + def error(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:error, verbosity, message, meta) + # end end @doc false - defmacro fun(verbosity, message, meta \\ []) do - quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do - FarmbotCore.Logger.dispatch_log(__ENV__, :fun, verbosity, message, meta) - end + def fun(verbosity, message, meta \\ []) do + # quote bind_quoted: [verbosity: verbosity, message: message, meta: meta] do + FarmbotCore.Logger.dispatch_log(:fun, verbosity, message, meta) + # end end defmacro report_termination() do @@ -70,7 +70,7 @@ defmodule FarmbotCore.Logger do end end - def insert_log!(%{ message: _, level: _, verbosity: _ } = input) do + def insert_log!(%{message: _, level: _, verbosity: _} = input) do params = input |> Map.delete(:__meta__) |> Map.delete(:__struct__) changeset = Log.changeset(%Log{}, params) @@ -79,6 +79,7 @@ defmodule FarmbotCore.Logger do message = Ecto.Changeset.get_field(changeset, :message) all = Repo.all(from l in Log, where: l.message == ^message, limit: 1) + case Enum.at(all, 0) do nil -> Repo.insert!(changeset) @@ -119,26 +120,16 @@ defmodule FarmbotCore.Logger do end @doc false - def dispatch_log(%Macro.Env{} = env, level, verbosity, message, meta) + def dispatch_log(level, verbosity, message, meta) when level in @log_types and is_number(verbosity) and is_binary(message) and is_list(meta) do - fun = - case env.function do - {fun, ar} -> "#{fun}/#{ar}" - nil -> "no_function" - end - %{ level: level, verbosity: verbosity, message: message, - meta: Map.new(meta), - function: fun, - file: env.file, - line: env.line, - module: env.module + meta: Map.new(meta) } |> dispatch_log() end @@ -158,10 +149,12 @@ defmodule FarmbotCore.Logger do defp maybe_espeak(_), do: nil def do_espeak(message) do - speech = message + speech = + message |> String.trim() |> String.slice(1..400) |> inspect() + :os.cmd('espeak #{speech} --stdout | aplay') end @@ -182,6 +175,7 @@ defmodule FarmbotCore.Logger do # the assumption that there is a very serious problem. def maybe_truncate_logs!(limit \\ 1000) do count = Repo.one(from l in "logs", select: count(l.id)) + if count > limit do Repo.delete_all(Log) end diff --git a/farmbot_core/lib/farmbot_core/project.ex b/lib/core/project.ex similarity index 66% rename from farmbot_core/lib/farmbot_core/project.ex rename to lib/core/project.ex index a79734915..db1cc96a2 100644 --- a/farmbot_core/lib/farmbot_core/project.ex +++ b/lib/core/project.ex @@ -1,9 +1,12 @@ defmodule FarmbotCore.Project do @moduledoc "Farmbot project config" - @version Mix.Project.config[:version] || Mix.raise("Missing Project key version") - @commit Mix.Project.config[:commit] || Mix.raise("Missing Project key commit") - @branch Mix.Project.config[:branch] || Mix.raise("Missing Project key branch") + @version Mix.Project.config()[:version] || + Mix.raise("Missing Project key version") + @commit Mix.Project.config()[:commit] || + Mix.raise("Missing Project key commit") + @branch Mix.Project.config()[:branch] || + Mix.raise("Missing Project key branch") @target Mix.target() @env Mix.env() @@ -23,8 +26,6 @@ defmodule FarmbotCore.Project do @compile {:inline, branch: 0} def branch, do: @branch - def arduino_commit, do: "---" - @doc "*#{@target}*" @compile {:inline, target: 0} def target, do: @target diff --git a/farmbot_core/lib/farmbot_core/time_utils.ex b/lib/core/time_utils.ex similarity index 100% rename from farmbot_core/lib/farmbot_core/time_utils.ex rename to lib/core/time_utils.ex diff --git a/farmbot_ext/lib/farmbot_ext/api.ex b/lib/ext/api.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/api.ex rename to lib/ext/api.ex diff --git a/farmbot_ext/lib/farmbot_ext/api/image_uploader.ex b/lib/ext/api/image_uploader.ex similarity index 95% rename from farmbot_ext/lib/farmbot_ext/api/image_uploader.ex rename to lib/ext/api/image_uploader.ex index ceba6d36a..358e9413a 100644 --- a/farmbot_ext/lib/farmbot_ext/api/image_uploader.ex +++ b/lib/ext/api/image_uploader.ex @@ -33,7 +33,9 @@ defmodule FarmbotExt.API.ImageUploader do def handle_info(:timeout, state) do files = Path.wildcard(Path.join(@images_path, "*")) - |> Enum.filter(&matches_any_pattern?(&1, [~r{/tmp/images/.*(jpg|jpeg|png|gif)}])) + |> Enum.filter( + &matches_any_pattern?(&1, [~r{/tmp/images/.*(jpg|jpeg|png|gif)}]) + ) {:noreply, state, {:continue, files}} end diff --git a/farmbot_ext/lib/farmbot_ext/api/ping.ex b/lib/ext/api/ping.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/api/ping.ex rename to lib/ext/api/ping.ex diff --git a/farmbot_ext/lib/farmbot_ext/api/preloader.ex b/lib/ext/api/preloader.ex similarity index 86% rename from farmbot_ext/lib/farmbot_ext/api/preloader.ex rename to lib/ext/api/preloader.ex index 4ba626b2a..1eb39854e 100644 --- a/farmbot_ext/lib/farmbot_ext/api/preloader.ex +++ b/lib/ext/api/preloader.ex @@ -18,7 +18,8 @@ defmodule FarmbotExt.API.Preloader do """ def preload_all() do with {:ok, sync_changeset} <- API.get_changeset(Sync), - sync_changeset <- Reconciler.sync_group(sync_changeset, SyncGroup.group_0()) do + sync_changeset <- + Reconciler.sync_group(sync_changeset, SyncGroup.group_0()) do FarmbotCore.Logger.success(3, "Successfully preloaded resources.") do_auto_sync(sync_changeset) end @@ -33,7 +34,8 @@ defmodule FarmbotExt.API.Preloader do Reconciler.sync_group(sync_changeset, SyncGroup.group_2()), %Changeset{valid?: true} = sync_changeset <- Reconciler.sync_group(sync_changeset, SyncGroup.group_3()), - %Changeset{valid?: true} <- Reconciler.sync_group(sync_changeset, SyncGroup.group_4()) do + %Changeset{valid?: true} <- + Reconciler.sync_group(sync_changeset, SyncGroup.group_4()) do FarmbotCore.Logger.success(3, "Auto sync complete") :ok else diff --git a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex b/lib/ext/api/reconciler.ex similarity index 92% rename from farmbot_ext/lib/farmbot_ext/api/reconciler.ex rename to lib/ext/api/reconciler.ex index f8e5cbaf6..7948a171d 100644 --- a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex +++ b/lib/ext/api/reconciler.ex @@ -60,7 +60,8 @@ defmodule FarmbotExt.API.Reconciler do def sync_group(%Changeset{valid?: true} = ok, []), do: ok def sync_group(%Changeset{valid?: false} = error, []), do: {:error, error} - defp do_sync_group(%Changeset{} = sync_changeset, module) when is_atom(module) do + defp do_sync_group(%Changeset{} = sync_changeset, module) + when is_atom(module) do table = module.__schema__(:source) |> String.to_atom() # items is a list of changesets items = Changeset.get_field(sync_changeset, table) @@ -78,7 +79,8 @@ defmodule FarmbotExt.API.Reconciler do ids_that_were_deleted = ids_fbos_knows_about -- ids_the_api_knows_about sync_changeset = - Enum.reduce(ids_that_were_deleted, sync_changeset, fn id, sync_changeset -> + Enum.reduce(ids_that_were_deleted, sync_changeset, fn id, + sync_changeset -> Command.update(module, id, nil) sync_changeset end) @@ -87,7 +89,8 @@ defmodule FarmbotExt.API.Reconciler do end @doc false - def sync_reduce(module, %Item{} = item, %Changeset{} = sync_changeset) when is_atom(module) do + def sync_reduce(module, %Item{} = item, %Changeset{} = sync_changeset) + when is_atom(module) do cached_cs = EagerLoader.get_cache(module, item.id) local_item = Repo.one(from(d in module, where: d.id == ^item.id)) @@ -113,7 +116,8 @@ defmodule FarmbotExt.API.Reconciler do {:insert, changeset} end - defp get_changeset(module, %Item{} = sync_item, %Changeset{} = cached) when is_atom(module) do + defp get_changeset(module, %Item{} = sync_item, %Changeset{} = cached) + when is_atom(module) do cached_updated_at = Changeset.get_field(cached, :updated_at) sync_item_updated_at = sync_item.updated_at @@ -153,7 +157,11 @@ defmodule FarmbotExt.API.Reconciler do # If the cache is the same `updated_at` as the API, check if the cache # is newer than `local_item.updated_at` # if the cache is not the same `updated_at` as the API, fallback to HTTP. - defp get_changeset(%{} = local_item, %Item{} = sync_item, %Changeset{} = cached) do + defp get_changeset( + %{} = local_item, + %Item{} = sync_item, + %Changeset{} = cached + ) do cached_updated_at = Changeset.get_field(cached, :updated_at) sync_item_updated_at = sync_item.updated_at cache_compare = compare_datetimes(sync_item_updated_at, cached_updated_at) diff --git a/farmbot_ext/lib/farmbot_ext/api/sync_group.ex b/lib/ext/api/sync_group.ex similarity index 93% rename from farmbot_ext/lib/farmbot_ext/api/sync_group.ex rename to lib/ext/api/sync_group.ex index cba31422e..e3b565447 100644 --- a/farmbot_ext/lib/farmbot_ext/api/sync_group.ex +++ b/lib/ext/api/sync_group.ex @@ -20,7 +20,8 @@ defmodule FarmbotExt.API.SyncGroup do Tool } - def all_groups, do: group_0() ++ group_1() ++ group_2() ++ group_3() ++ group_4() + def all_groups, + do: group_0() ++ group_1() ++ group_2() ++ group_3() ++ group_4() @doc "Assets in Group 0 are required for FarmBot to operate." def group_0, diff --git a/farmbot_ext/lib/farmbot_ext/api/view.ex b/lib/ext/api/view.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/api/view.ex rename to lib/ext/api/view.ex diff --git a/farmbot_ext/lib/farmbot_ext/api_adapter.ex b/lib/ext/api_adapter.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/api_adapter.ex rename to lib/ext/api_adapter.ex diff --git a/farmbot_ext/lib/farmbot_ext/api_fetcher.ex b/lib/ext/api_fetcher.ex similarity index 85% rename from farmbot_ext/lib/farmbot_ext/api_fetcher.ex rename to lib/ext/api_fetcher.ex index bef471c7b..dbfe9b818 100644 --- a/farmbot_ext/lib/farmbot_ext/api_fetcher.ex +++ b/lib/ext/api_fetcher.ex @@ -35,7 +35,8 @@ defmodule FarmbotExt.APIFetcher do {:ok, %{body: error, status: status}} when is_binary(error) -> get_body_error(path, status, error) - {:ok, %{body: %{"error" => error}, status: status}} when is_binary(error) -> + {:ok, %{body: %{"error" => error}, status: status}} + when is_binary(error) -> get_body_error(path, status, error) {:ok, %{body: error, status: status}} when is_binary(error) -> @@ -52,7 +53,10 @@ defmodule FarmbotExt.APIFetcher do {:ok, _tkn} = JWT.decode(binary_token) uri = URI.parse(server) - url = (uri.scheme || "https") <> "://" <> uri.host <> ":" <> to_string(uri.port) + + url = + (uri.scheme || "https") <> "://" <> uri.host <> ":" <> to_string(uri.port) + user_agent = "FarmbotOS/#{@version} (#{@target}) #{@target} ()" middleware = [ @@ -88,7 +92,10 @@ defmodule FarmbotExt.APIFetcher do def upload_image(image_filename, meta \\ %{}) do # I don't like that APIFetcher calls API- refactr out? {:ok, changeset} = FarmbotExt.API.get_changeset(StorageAuth) - storage_auth = %StorageAuth{form_data: form_data} = Ecto.Changeset.apply_changes(changeset) + + storage_auth = + %StorageAuth{form_data: form_data} = + Ecto.Changeset.apply_changes(changeset) content_length = :filelib.file_size(image_filename) {:ok, pid} = Agent.start_link(fn -> 0 end) @@ -139,17 +146,37 @@ defmodule FarmbotExt.APIFetcher do body <- %{attachment_url: attachment_url, meta: meta}, {:ok, %{status: s}} = r when s > 199 and s < 300 <- post(client, "/api/images", body) do - BotState.set_job_progress(image_filename, %{prog | status: "complete", percent: 100}) + BotState.set_job_progress(image_filename, %{ + prog + | status: "complete", + percent: 100 + }) + r else {:ok, %{status: s, body: body}} when s > 399 -> - FarmbotCore.Logger.error(1, "Failed to upload image (HTTP: #{s}): #{inspect(body)}") - BotState.set_job_progress(image_filename, %{prog | percent: -1, status: "error"}) + FarmbotCore.Logger.error( + 1, + "Failed to upload image (HTTP: #{s}): #{inspect(body)}" + ) + + BotState.set_job_progress(image_filename, %{ + prog + | percent: -1, + status: "error" + }) + {:error, body} er -> FarmbotCore.Logger.error(1, "Failed to upload image: #{inspect(er)}") - BotState.set_job_progress(image_filename, %{prog | percent: -1, status: "error"}) + + BotState.set_job_progress(image_filename, %{ + prog + | percent: -1, + status: "error" + }) + er end end @@ -190,6 +217,7 @@ defmodule FarmbotExt.APIFetcher do end defp adapter() do - {Tesla.Adapter.Hackney, ssl: [verify: :verify_peer, cacertfile: :certifi.cacertfile()]} + {Tesla.Adapter.Hackney, + ssl: [verify: :verify_peer, cacertfile: :certifi.cacertfile()]} end end diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap.ex b/lib/ext/bootstrap.ex similarity index 82% rename from farmbot_ext/lib/farmbot_ext/bootstrap.ex rename to lib/ext/bootstrap.ex index b0cd4a403..3e6649610 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap.ex +++ b/lib/ext/bootstrap.ex @@ -42,9 +42,10 @@ defmodule FarmbotExt.Bootstrap do def try_auth(email, server, nil, secret) when is_binary(secret) do Logger.debug("using secret to auth") - with {:ok, tkn} <- Authorization.authorize_with_secret(email, secret, server), + with {:ok, tkn} <- + Authorization.authorize_with_secret(email, secret, server), _ <- update_config_value(:string, "authorization", "token", tkn), - {:ok, pid} <- Supervisor.start_child(FarmbotExt, Bootstrap.Supervisor) do + {:ok, pid} <- Supervisor.start_child(FarmbotOS, Bootstrap.Supervisor) do {:noreply, pid} else _ -> FarmbotExt.Time.no_reply(nil, 5000) @@ -52,9 +53,10 @@ defmodule FarmbotExt.Bootstrap do end def try_auth(email, server, password, _secret) do - with {:ok, tkn} <- Authorization.authorize_with_password(email, password, server), + with {:ok, tkn} <- + Authorization.authorize_with_password(email, password, server), _ <- update_config_value(:string, "authorization", "token", tkn), - {:ok, pid} <- Supervisor.start_child(FarmbotExt, Bootstrap.Supervisor) do + {:ok, pid} <- Supervisor.start_child(FarmbotOS, Bootstrap.Supervisor) do {:noreply, pid} else # Changing the error message on the API @@ -63,7 +65,7 @@ defmodule FarmbotExt.Bootstrap do msg = "Password auth failed! Check again and reconfigurate." Logger.error(msg) FarmbotCore.Logger.debug(3, msg) - FarmbotCore.Celery.SysCalls.factory_reset("farmbot_os") + FarmbotCore.Celery.SysCallGlue.factory_reset("farmbot_os") FarmbotExt.Time.no_reply(nil, 5000) er -> @@ -79,7 +81,8 @@ defmodule FarmbotExt.Bootstrap do server = get_config_value(:string, "authorization", "server") secret = get_config_value(:string, "authorization", "secret") - with {:ok, tkn} <- Authorization.authorize_with_secret(email, secret, server), + with {:ok, tkn} <- + Authorization.authorize_with_secret(email, secret, server), _ <- update_config_value(:string, "authorization", "token", tkn) do {:ok, tkn} end diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex b/lib/ext/bootstrap/authorization.ex similarity index 82% rename from farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex rename to lib/ext/bootstrap/authorization.ex index 90afb993d..5bf08e4dd 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/authorization.ex +++ b/lib/ext/bootstrap/authorization.ex @@ -72,7 +72,7 @@ defmodule FarmbotExt.Bootstrap.Authorization do def build_secret(email, password, rsa_key) do %{email: email, password: password, id: UUID.uuid1(), version: 1} |> JSON.encode!() - |> RSA.encrypt({:public, rsa_key}) + |> rsa_encrypt({:public, rsa_key}) end @headers [ @@ -85,11 +85,12 @@ defmodule FarmbotExt.Bootstrap.Authorization do url = "#{server}/api/public_key" with {:ok, body} <- do_request({:get, url, "", @headers}) do - {:ok, RSA.decode_key(body)} + {:ok, rsa_decode_key(body)} end end - @spec request_token(server, binary) :: {:ok, binary} | {:error, String.t() | atom} + @spec request_token(server, binary) :: + {:ok, binary} | {:error, String.t() | atom} def request_token(server, payload, tries_remaining \\ 10) do url = "#{server}/api/tokens" @@ -105,7 +106,11 @@ defmodule FarmbotExt.Bootstrap.Authorization do # Network error such such as wifi disconnect, dns down etc. # Try again. {:error, reason} when tries_remaining == 0 -> - FarmbotCore.Logger.error(1, "Farmbot failed to request token: #{inspect(reason)}") + FarmbotCore.Logger.error( + 1, + "Farmbot failed to request token: #{inspect(reason)}" + ) + {:error, reason} {:error, _reason} -> @@ -117,7 +122,9 @@ defmodule FarmbotExt.Bootstrap.Authorization do def do_request(request, state \\ %{backoff: 5000, log_dispatch_flag: false}) def do_request({method, url, payload, headers}, state) do - headers = Enum.map(headers, fn {k, v} -> {to_charlist(k), to_charlist(v)} end) + headers = + Enum.map(headers, fn {k, v} -> {to_charlist(k), to_charlist(v)} end) + opts = [{:body_format, :binary}] request = @@ -125,7 +132,7 @@ defmodule FarmbotExt.Bootstrap.Authorization do do: {to_charlist(url), headers}, else: {to_charlist(url), headers, 'Application/JSON', payload} - resp = FarmbotTelemetry.HTTP.request(method, request, [], opts) + resp = FarmbotOS.HTTP.request(method, request, [], opts) case resp do {:ok, {{_, c, _}, _headers, body}} when c >= 200 and c <= 299 -> @@ -133,7 +140,12 @@ defmodule FarmbotExt.Bootstrap.Authorization do {:ok, {{_, c, _}, _headers, body}} when c >= 400 and c <= 499 -> err = get_error_message(body) - FarmbotCore.Logger.error(1, "Authorization error for url: #{url} #{err}") + + FarmbotCore.Logger.error( + 1, + "Authorization error for url: #{url} #{err}" + ) + {:error, {:authorization, err}} {:ok, {{_, c, _}, _headers, body}} when c >= 500 and c <= 599 -> @@ -166,4 +178,21 @@ defmodule FarmbotExt.Bootstrap.Authorization do _ -> bin end end + + # Encrypt using the public key + def rsa_encrypt(text, {:public, key}) do + text |> :public_key.encrypt_public(key) + end + + # Decode a key from its text representation to a PEM structure + def rsa_decode_key(text) do + [entry] = :public_key.pem_decode(text) + :public_key.pem_entry_decode(entry) + end + + # ONLY NEEDED FOR TESTS AND VERIFICATION. + # Decrypt using the private key + def rsa_decrypt(cyphertext, {:private, key}) do + cyphertext |> :public_key.decrypt_private(key) + end end diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_support.ex b/lib/ext/bootstrap/drop_password_support.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_support.ex rename to lib/ext/bootstrap/drop_password_support.ex diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_task.ex b/lib/ext/bootstrap/drop_password_task.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/bootstrap/drop_password_task.ex rename to lib/ext/bootstrap/drop_password_task.ex diff --git a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex b/lib/ext/bootstrap/supervisor.ex similarity index 91% rename from farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex rename to lib/ext/bootstrap/supervisor.ex index 126bf3bc3..efa9d9a42 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex +++ b/lib/ext/bootstrap/supervisor.ex @@ -16,7 +16,7 @@ defmodule FarmbotExt.Bootstrap.Supervisor do end def children() do - config = Application.get_env(:farmbot_ext, __MODULE__) || [] + config = Application.get_env(:farmbot, __MODULE__) || [] Keyword.get(config, :children, [ FarmbotExt.EagerLoader.Supervisor, diff --git a/farmbot_ext/lib/farmbot_ext/dirty_worker.ex b/lib/ext/dirty_worker.ex similarity index 99% rename from farmbot_ext/lib/farmbot_ext/dirty_worker.ex rename to lib/ext/dirty_worker.ex index efafddd99..0b9ab0e62 100644 --- a/farmbot_ext/lib/farmbot_ext/dirty_worker.ex +++ b/lib/ext/dirty_worker.ex @@ -120,7 +120,7 @@ defmodule FarmbotExt.DirtyWorker do def do_stale_recovery(timeout) do FarmbotCore.Logger.error(4, @stale_warning) Private.recover_from_row_lock_failure() - FarmbotCore.Celery.SysCalls.sync() + FarmbotCore.Celery.SysCallGlue.sync() FarmbotExt.Time.sleep(timeout * 10) true end diff --git a/farmbot_ext/lib/farmbot_ext/dirty_worker/supervisor.ex b/lib/ext/dirty_worker/supervisor.ex similarity index 95% rename from farmbot_ext/lib/farmbot_ext/dirty_worker/supervisor.ex rename to lib/ext/dirty_worker/supervisor.ex index 0b7397b13..ae4f95f1c 100644 --- a/farmbot_ext/lib/farmbot_ext/dirty_worker/supervisor.ex +++ b/lib/ext/dirty_worker/supervisor.ex @@ -36,7 +36,7 @@ defmodule FarmbotExt.DirtyWorker.Supervisor do end def children do - config = Application.get_env(:farmbot_ext, __MODULE__) || [] + config = Application.get_env(:farmbot, __MODULE__) || [] Keyword.get(config, :children, [ {DirtyWorker, Device}, diff --git a/farmbot_ext/lib/farmbot_ext/eager_loader.ex b/lib/ext/eager_loader.ex similarity index 91% rename from farmbot_ext/lib/farmbot_ext/eager_loader.ex rename to lib/ext/eager_loader.ex index 08042810e..caf913b91 100644 --- a/farmbot_ext/lib/farmbot_ext/eager_loader.ex +++ b/lib/ext/eager_loader.ex @@ -50,7 +50,9 @@ defmodule FarmbotExt.EagerLoader do end def preload(asset_module, %{id: id}) when is_atom(asset_module) do - local = Repo.one(from(m in asset_module, where: m.id == ^id)) || asset_module + local = + Repo.one(from(m in asset_module, where: m.id == ^id)) || asset_module + API.get_changeset(local, id) end @@ -75,8 +77,15 @@ defmodule FarmbotExt.EagerLoader do def cache(%Changeset{data: %module{}} = changeset) do id = Changeset.get_field(changeset, :id) updated_at = Changeset.get_field(changeset, :updated_at) - id || change_error(changeset, "Can't cache a changeset with no :id attribute") - updated_at || change_error(changeset, "Can't cache a changeset with no :updated_at attribute") + + id || + change_error(changeset, "Can't cache a changeset with no :id attribute") + + updated_at || + change_error( + changeset, + "Can't cache a changeset with no :updated_at attribute" + ) pid(module) |> GenServer.cast({:cache, id, changeset}) diff --git a/farmbot_ext/lib/farmbot_ext/eager_loader/supervisor.ex b/lib/ext/eager_loader/supervisor.ex similarity index 89% rename from farmbot_ext/lib/farmbot_ext/eager_loader/supervisor.ex rename to lib/ext/eager_loader/supervisor.ex index 6211d3e13..02460d510 100644 --- a/farmbot_ext/lib/farmbot_ext/eager_loader/supervisor.ex +++ b/lib/ext/eager_loader/supervisor.ex @@ -33,7 +33,8 @@ defmodule FarmbotExt.EagerLoader.Supervisor do @doc "Drop all cached assets" def drop_all_cache() do - for {_, pid, _, _} <- Supervisor.which_children(FarmbotExt.EagerLoader.Supervisor), + for {_, pid, _, _} <- + Supervisor.which_children(FarmbotExt.EagerLoader.Supervisor), do: GenServer.cast(pid, :drop) end @@ -43,7 +44,7 @@ defmodule FarmbotExt.EagerLoader.Supervisor do end def children do - config = Application.get_env(:farmbot_ext, __MODULE__) || [] + config = Application.get_env(:farmbot, __MODULE__) || [] Keyword.get(config, :children, [ {EagerLoader, Device}, diff --git a/farmbot_ext/lib/farmbot_ext/jwt.ex b/lib/ext/jwt.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/jwt.ex rename to lib/ext/jwt.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/bot_state_handler.ex b/lib/ext/mqtt/bot_state_handler.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/bot_state_handler.ex rename to lib/ext/mqtt/bot_state_handler.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/log_handler.ex b/lib/ext/mqtt/log_handler.ex similarity index 99% rename from farmbot_ext/lib/farmbot_ext/mqtt/log_handler.ex rename to lib/ext/mqtt/log_handler.ex index 7abd27e5e..537956ab5 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/log_handler.ex +++ b/lib/ext/mqtt/log_handler.ex @@ -32,7 +32,7 @@ defmodule FarmbotExt.MQTT.LogHandler do def handle_info(:timeout, %{state_cache: nil} = state) do initial_bot_state = BotState.subscribe() - FarmbotExt.Time.no_reply(%{state | state_cache: initial_bot_state}, 0) + FarmbotExt.Time.no_reply(%{state | state_cache: initial_bot_state}, 1000) end def handle_info(:timeout, state) do diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/log_handler_support.ex b/lib/ext/mqtt/log_handler_support.ex similarity index 94% rename from farmbot_ext/lib/farmbot_ext/mqtt/log_handler_support.ex rename to lib/ext/mqtt/log_handler_support.ex index 6c8c0d506..4adad9d46 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/log_handler_support.ex +++ b/lib/ext/mqtt/log_handler_support.ex @@ -38,7 +38,8 @@ defmodule FarmbotExt.MQTT.LogHandlerSupport do patch_version: log.version.patch, # QUESTION(Connor) - Why does this need `.to_unix()`? # ANSWER(Connor) - because the FE needed it. - created_at: DateTime.from_naive!(log.inserted_at, "Etc/UTC") |> DateTime.to_unix(), + created_at: + DateTime.from_naive!(log.inserted_at, "Etc/UTC") |> DateTime.to_unix(), channels: log.meta[:channels] || log.meta["channels"] || [], meta: %{ assertion_passed: log.meta[:assertion_passed], diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex b/lib/ext/mqtt/mqtt.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex rename to lib/ext/mqtt/mqtt.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/ping_handler.ex b/lib/ext/mqtt/ping_handler.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/ping_handler.ex rename to lib/ext/mqtt/ping_handler.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex b/lib/ext/mqtt/rpc_handler.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex rename to lib/ext/mqtt/rpc_handler.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/supervisor.ex b/lib/ext/mqtt/supervisor.ex similarity index 96% rename from farmbot_ext/lib/farmbot_ext/mqtt/supervisor.ex rename to lib/ext/mqtt/supervisor.ex index 9bb4dfa0c..471f9d8b3 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/supervisor.ex +++ b/lib/ext/mqtt/supervisor.ex @@ -18,7 +18,7 @@ defmodule FarmbotExt.MQTT.Supervisor do def children do token = Config.get_config_value(:string, "authorization", "token") - config = Application.get_env(:farmbot_ext, __MODULE__) || [] + config = Application.get_env(:farmbot, __MODULE__) || [] Keyword.get(config, :children, [mqtt_child(token)]) end diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/support.ex b/lib/ext/mqtt/support.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/support.ex rename to lib/ext/mqtt/support.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler.ex b/lib/ext/mqtt/sync_handler.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/sync_handler.ex rename to lib/ext/mqtt/sync_handler.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex b/lib/ext/mqtt/sync_handler_support.ex similarity index 94% rename from farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex rename to lib/ext/mqtt/sync_handler_support.ex index b0f7e1abd..f1fafe46d 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex +++ b/lib/ext/mqtt/sync_handler_support.ex @@ -25,7 +25,11 @@ defmodule FarmbotExt.MQTT.SyncHandlerSupport do BotState.set_sync_status("sync_error") _ = Leds.green(:slow_blink) Logger.debug("Error preloading. #{inspect(reason)}") - FarmbotTelemetry.event(:asset_sync, :preload_error, nil, error: inspect(reason)) + + FarmbotTelemetry.event(:asset_sync, :preload_error, nil, + error: inspect(reason) + ) + FarmbotExt.Time.send_after(self(), :preload, 5000) {:noreply, state} diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/telemetry_handler.ex b/lib/ext/mqtt/telemetry_handler.ex similarity index 91% rename from farmbot_ext/lib/farmbot_ext/mqtt/telemetry_handler.ex rename to lib/ext/mqtt/telemetry_handler.ex index dd40e4c47..b6340ce33 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/telemetry_handler.ex +++ b/lib/ext/mqtt/telemetry_handler.ex @@ -52,7 +52,13 @@ defmodule FarmbotExt.MQTT.TelemetryHandler do }) publish(state, json) - FarmbotExt.Time.send_after(self(), :dispatch_metrics, @dispatch_metrics_timeout) + + FarmbotExt.Time.send_after( + self(), + :dispatch_metrics, + @dispatch_metrics_timeout + ) + {:noreply, state} end @@ -74,7 +80,13 @@ defmodule FarmbotExt.MQTT.TelemetryHandler do publish(state, json) end) - _ = FarmbotExt.Time.send_after(self(), :consume_telemetry, @consume_telemetry_timeout) + _ = + FarmbotExt.Time.send_after( + self(), + :consume_telemetry, + @consume_telemetry_timeout + ) + {:noreply, state} end diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/terminal_handler.ex b/lib/ext/mqtt/terminal_handler.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/terminal_handler.ex rename to lib/ext/mqtt/terminal_handler.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/terminal_handler_support.ex b/lib/ext/mqtt/terminal_handler_support.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/terminal_handler_support.ex rename to lib/ext/mqtt/terminal_handler_support.ex diff --git a/farmbot_ext/lib/farmbot_ext/mqtt/topic_supervisor.ex b/lib/ext/mqtt/topic_supervisor.ex similarity index 100% rename from farmbot_ext/lib/farmbot_ext/mqtt/topic_supervisor.ex rename to lib/ext/mqtt/topic_supervisor.ex diff --git a/farmbot_ext/lib/farmbot_ext/time.ex b/lib/ext/time.ex similarity index 92% rename from farmbot_ext/lib/farmbot_ext/time.ex rename to lib/ext/time.ex index 6452b837c..79b79c4af 100644 --- a/farmbot_ext/lib/farmbot_ext/time.ex +++ b/lib/ext/time.ex @@ -1,6 +1,6 @@ # FarmbotExt.Time.no_reply() defmodule FarmbotExt.Time do - @conf Application.get_env(:farmbot_ext, __MODULE__) || [] + @conf Application.get_env(:farmbot, __MODULE__) || [] @disabled Keyword.get(@conf, :disable_timeouts, false) @doc """ diff --git a/lib/farmbot_os.ex b/lib/farmbot_os.ex new file mode 100644 index 000000000..e38d0b2f5 --- /dev/null +++ b/lib/farmbot_os.ex @@ -0,0 +1,31 @@ +defmodule FarmbotOS do + @moduledoc false + + use Application + + @telemetry_config [ + access: :read_write, + type: :set, + file: '/tmp/farmbot_telemetry.dets' + ] + def start(_type, _args) do + {:ok, :farmbot} = :dets.open_file(:farmbot, @telemetry_config) + + children = [ + FarmbotCore.Asset.Repo, + FarmbotOS.EctoMigrator, + FarmbotCore.BotState.Supervisor, + FarmbotExt.Bootstrap, + {FarmbotOS.Configurator.Supervisor, []}, + {FarmbotOS.Init.Supervisor, []}, + FarmbotCore.Leds, + FarmbotCore.Celery.Scheduler, + FarmbotCore.FirmwareEstopTimer, + {FarmbotOS.Platform.Supervisor, []}, + FarmbotCore.Asset.Supervisor, + FarmbotCore.Firmware.UARTObserver + ] + + Supervisor.start_link(children, strategy: :one_for_one, name: __MODULE__) + end +end diff --git a/farmbot_telemetry/lib/farmbot_telemetry.ex b/lib/farmbot_telemetry.ex similarity index 72% rename from farmbot_telemetry/lib/farmbot_telemetry.ex rename to lib/farmbot_telemetry.ex index e4ed0c670..e6639f549 100644 --- a/farmbot_telemetry/lib/farmbot_telemetry.ex +++ b/lib/farmbot_telemetry.ex @@ -33,56 +33,35 @@ defmodule FarmbotTelemetry do end @doc "Execute a telemetry event" - defmacro event(subsystem, measurement_or_event_name, value \\ nil, meta \\ []) - - defmacro event(subsystem, measurement, value, meta) - when is_atom(subsystem) and is_atom(measurement) and is_list(meta) do - quote location: :keep do - FarmbotTelemetry.bare_telemetry( - UUID.uuid4(), - :event, - unquote(subsystem), - unquote(measurement), - unquote(value), - DateTime.utc_now(), - Keyword.merge(unquote(meta), - module: __ENV__.module, - file: __ENV__.file, - line: __ENV__.line, - function: __ENV__.function - ) + def event(subsystem, measurement_or_event_name, value \\ nil, meta \\ []) + + def event(subsystem, measurement, value, meta) + when is_atom(subsystem) and + is_atom(measurement) and + is_list(meta) do + FarmbotTelemetry.bare_telemetry( + UUID.uuid4(), + :event, + subsystem, + measurement, + value, + DateTime.utc_now(), + Keyword.merge(meta, + module: __ENV__.module, + file: __ENV__.file, + line: __ENV__.line, + function: __ENV__.function ) - end + ) end - defmacro event(subsystem, measurement, value, meta) do + def event(subsystem, measurement, value, meta) do Mix.raise(""" Unknown args for telemetry event: #{inspect(subsystem)}, #{inspect(measurement)}, #{inspect(value)}, #{inspect(meta)} """) end - @doc "Execute a telemetry metric" - defmacro metric(subsystem, measurement, value, meta \\ []) - when is_atom(subsystem) and is_atom(measurement) and is_list(meta) do - quote location: :keep do - FarmbotTelemetry.bare_telemetry( - UUID.uuid4(), - :metric, - unquote(subsystem), - unquote(measurement), - unquote(value), - DateTime.utc_now(), - Keyword.merge(unquote(meta), - module: __ENV__.module, - file: __ENV__.file, - line: __ENV__.line, - function: __ENV__.function - ) - ) - end - end - @doc """ Function responsible for firing telemetry events stores telemetry event in `dets` table to be cached until @@ -116,7 +95,7 @@ defmodule FarmbotTelemetry do is_list(meta) do _ = :telemetry.execute( - [:farmbot_telemetry, kind, subsystem], + [:farmbot, kind, subsystem], %{ measurement: measurement, value: value, @@ -128,7 +107,7 @@ defmodule FarmbotTelemetry do _ = :dets.insert( - :farmbot_telemetry, + :farmbot, {uuid, captured_at, kind, subsystem, measurement, value, Map.new(meta)} ) end @@ -137,7 +116,7 @@ defmodule FarmbotTelemetry do def attach_logger(kind, subsystem, config \\ []) do :telemetry.attach( "farmbot-telemetry-logger-#{kind}-#{subsystem}-#{UUID.uuid4()}", - [:farmbot_telemetry, kind, subsystem], + [:farmbot, kind, subsystem], &FarmbotTelemetry.log_handler/4, config ) @@ -147,7 +126,7 @@ defmodule FarmbotTelemetry do def attach_recv(kind, subsystem, pid) do :telemetry.attach( "farmbot-telemetry-recv-#{kind}-#{subsystem}-#{UUID.uuid4()}", - [:farmbot_telemetry, kind, subsystem], + [:farmbot, kind, subsystem], &Kernel.send(pid, {&1, &2, &3, &4}), pid: self() ) @@ -179,7 +158,7 @@ defmodule FarmbotTelemetry do """ @spec consume_telemetry(consumer_fun()) :: :ok def consume_telemetry(fun) do - all_events = :dets.match_object(:farmbot_telemetry, :_) + all_events = :dets.match_object(:farmbot, :_) tasks = Enum.map(all_events, fn event -> @@ -199,7 +178,7 @@ defmodule FarmbotTelemetry do end case result do - :ok -> :dets.delete(:farmbot_telemetry, uuid) + :ok -> :dets.delete(:farmbot, uuid) _ -> :ok end end) diff --git a/farmbot_core/lib/firmware/avrdude.ex b/lib/firmware/avrdude.ex similarity index 100% rename from farmbot_core/lib/firmware/avrdude.ex rename to lib/firmware/avrdude.ex diff --git a/farmbot_core/lib/firmware/command.ex b/lib/firmware/command.ex similarity index 100% rename from farmbot_core/lib/firmware/command.ex rename to lib/firmware/command.ex diff --git a/farmbot_core/lib/firmware/config_uploader.ex b/lib/firmware/config_uploader.ex similarity index 100% rename from farmbot_core/lib/firmware/config_uploader.ex rename to lib/firmware/config_uploader.ex diff --git a/farmbot_core/lib/firmware/error_detector.ex b/lib/firmware/error_detector.ex similarity index 100% rename from farmbot_core/lib/firmware/error_detector.ex rename to lib/firmware/error_detector.ex diff --git a/farmbot_core/lib/firmware/flash.ex b/lib/firmware/flash.ex similarity index 100% rename from farmbot_core/lib/firmware/flash.ex rename to lib/firmware/flash.ex diff --git a/farmbot_core/lib/firmware/flash_utils.ex b/lib/firmware/flash_utils.ex similarity index 94% rename from farmbot_core/lib/firmware/flash_utils.ex rename to lib/firmware/flash_utils.ex index 00eb724b7..b339888bb 100644 --- a/farmbot_core/lib/firmware/flash_utils.ex +++ b/lib/firmware/flash_utils.ex @@ -22,7 +22,7 @@ defmodule FarmbotCore.Firmware.FlashUtils do FarmbotCore.Logger.warn(3, @scary_warning) {:ok, @custom_firmware} else - assert_exists(Application.app_dir(:farmbot_core, ["priv", name])) + assert_exists(Application.app_dir(:farmbot, ["priv", name])) end end diff --git a/farmbot_core/lib/firmware/floating_point.ex b/lib/firmware/floating_point.ex similarity index 100% rename from farmbot_core/lib/firmware/floating_point.ex rename to lib/firmware/floating_point.ex diff --git a/farmbot_core/lib/firmware/gcode.ex b/lib/firmware/gcode.ex similarity index 100% rename from farmbot_core/lib/firmware/gcode.ex rename to lib/firmware/gcode.ex diff --git a/farmbot_core/lib/firmware/gcode_decoder.ex b/lib/firmware/gcode_decoder.ex similarity index 95% rename from farmbot_core/lib/firmware/gcode_decoder.ex rename to lib/firmware/gcode_decoder.ex index 2f3d85841..09c021571 100644 --- a/farmbot_core/lib/firmware/gcode_decoder.ex +++ b/lib/firmware/gcode_decoder.ex @@ -3,6 +3,7 @@ defmodule FarmbotCore.Firmware.GCodeDecoder do """ require Logger + require FarmbotCore.Logger @response_codes %{ "00" => :idle, @@ -66,6 +67,7 @@ defmodule FarmbotCore.Firmware.GCodeDecoder do def run(messages) do messages |> Enum.map(&validate_message/1) + |> Enum.reject(&is_nil/1) |> Enum.map(&process/1) end @@ -73,8 +75,9 @@ defmodule FarmbotCore.Firmware.GCodeDecoder do defp validate_message("R" <> _ = m), do: m defp validate_message(message) do - actual = inspect(message) - raise "Expect inbound GCode to begin with `R`. Got: #{actual}" + log = "Dropping malformed message: #{inspect(message)}" + FarmbotCore.Logger.debug(3, log) + nil end defp process("R83" <> rest) do diff --git a/farmbot_core/lib/firmware/inbound_side_effects.ex b/lib/firmware/inbound_side_effects.ex similarity index 100% rename from farmbot_core/lib/firmware/inbound_side_effects.ex rename to lib/firmware/inbound_side_effects.ex diff --git a/farmbot_core/lib/firmware/lua_uart.ex b/lib/firmware/lua_uart.ex similarity index 100% rename from farmbot_core/lib/firmware/lua_uart.ex rename to lib/firmware/lua_uart.ex diff --git a/farmbot_core/lib/firmware/parameter.ex b/lib/firmware/parameter.ex similarity index 100% rename from farmbot_core/lib/firmware/parameter.ex rename to lib/firmware/parameter.ex diff --git a/farmbot_core/lib/firmware/request.ex b/lib/firmware/request.ex similarity index 100% rename from farmbot_core/lib/firmware/request.ex rename to lib/firmware/request.ex diff --git a/farmbot_core/lib/firmware/resetter.ex b/lib/firmware/resetter.ex similarity index 100% rename from farmbot_core/lib/firmware/resetter.ex rename to lib/firmware/resetter.ex diff --git a/farmbot_core/lib/firmware/rx_buffer.ex b/lib/firmware/rx_buffer.ex similarity index 100% rename from farmbot_core/lib/firmware/rx_buffer.ex rename to lib/firmware/rx_buffer.ex diff --git a/farmbot_core/lib/firmware/tx_buffer.ex b/lib/firmware/tx_buffer.ex similarity index 100% rename from farmbot_core/lib/firmware/tx_buffer.ex rename to lib/firmware/tx_buffer.ex diff --git a/farmbot_core/lib/firmware/uart_core.ex b/lib/firmware/uart_core.ex similarity index 100% rename from farmbot_core/lib/firmware/uart_core.ex rename to lib/firmware/uart_core.ex diff --git a/farmbot_core/lib/firmware/uart_core_support.ex b/lib/firmware/uart_core_support.ex similarity index 100% rename from farmbot_core/lib/firmware/uart_core_support.ex rename to lib/firmware/uart_core_support.ex diff --git a/farmbot_core/lib/firmware/uart_detector.ex b/lib/firmware/uart_detector.ex similarity index 100% rename from farmbot_core/lib/firmware/uart_detector.ex rename to lib/firmware/uart_detector.ex diff --git a/farmbot_core/lib/firmware/uart_observer.ex b/lib/firmware/uart_observer.ex similarity index 100% rename from farmbot_core/lib/firmware/uart_observer.ex rename to lib/firmware/uart_observer.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/config_data_layer.ex b/lib/os/configurator/config_data_layer.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/config_data_layer.ex rename to lib/os/configurator/config_data_layer.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/data_layer.ex b/lib/os/configurator/data_layer.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/data_layer.ex rename to lib/os/configurator/data_layer.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/dets_telemetry_layer.ex b/lib/os/configurator/dets_telemetry_layer.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/dets_telemetry_layer.ex rename to lib/os/configurator/dets_telemetry_layer.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/fake_network_layer.ex b/lib/os/configurator/fake_network_layer.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/fake_network_layer.ex rename to lib/os/configurator/fake_network_layer.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/logger_backend.ex b/lib/os/configurator/logger_backend.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/logger_backend.ex rename to lib/os/configurator/logger_backend.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex b/lib/os/configurator/logger_socket.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/logger_socket.ex rename to lib/os/configurator/logger_socket.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/network_layer.ex b/lib/os/configurator/network_layer.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/network_layer.ex rename to lib/os/configurator/network_layer.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/router.ex b/lib/os/configurator/router.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/router.ex rename to lib/os/configurator/router.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/supervisor.ex b/lib/os/configurator/supervisor.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/supervisor.ex rename to lib/os/configurator/supervisor.ex diff --git a/farmbot_os/lib/farmbot_os/configurator/telemetry_layer.ex b/lib/os/configurator/telemetry_layer.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/configurator/telemetry_layer.ex rename to lib/os/configurator/telemetry_layer.ex diff --git a/farmbot_os/lib/farmbot_os/filesystem.ex b/lib/os/filesystem.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/filesystem.ex rename to lib/os/filesystem.ex diff --git a/farmbot_os/lib/farmbot_os/init/fs_checkup.ex b/lib/os/init/fs_checkup.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/init/fs_checkup.ex rename to lib/os/init/fs_checkup.ex diff --git a/farmbot_os/lib/farmbot_os/init/supervisor.ex b/lib/os/init/supervisor.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/init/supervisor.ex rename to lib/os/init/supervisor.ex diff --git a/lib/os/legacy_migrator.ex b/lib/os/legacy_migrator.ex new file mode 100644 index 000000000..37a092d8e --- /dev/null +++ b/lib/os/legacy_migrator.ex @@ -0,0 +1,100 @@ +# TODO: Delete this once FBOS 14.x reaches EOL. +defmodule FarmbotOS.LegacyMigrator do + import Ecto.Query + alias FarmbotCore.Config.NetworkInterface + alias FarmbotCore.Asset.Repo + require Logger + @db_path "/root/config-prod.sqlite3" + @done_flag "/root/v15_migration_done" + + def run(), do: spawn(__MODULE__, :do_run, []) + + def do_run() do + Logger.info("Running legacy data migrator...") + # Add a sleep for good luck since this runs at boot. + Process.sleep(10_000) + + if legacy_upgrade?() do + recover_old_configs() + if needs_network_config?(), do: recover_network_interfaces() + finish_upgrade() + end + end + + def legacy_upgrade?, do: File.exists?(@db_path) && !File.exists?(@done_flag) + + def needs_network_config? do + iface_count = Repo.one(from n in "network_interfaces", select: count(n.id)) + iface_count == 0 + end + + def finish_upgrade() do + File.touch(@done_flag) + FarmbotOS.System.reboot("Upgrading database...") + end + + def recover_network_interfaces() do + # DO NOT SORT THESE!! + columns = [ + :id, + :name, + :type, + :ssid, + :psk, + :security, + :ipv4_method, + :migrated, + :maybe_hidden, + :ipv4_address, + :ipv4_gateway, + :ipv4_subnet_mask, + :domain, + :name_servers, + :regulatory_domain, + :identity, + :password + ] + + # ^ KEY ORDER MATTERS + {:ok, conn} = Exqlite.Sqlite3.open(@db_path) + + {:ok, statement} = + Exqlite.Sqlite3.prepare(conn, "SELECT * FROM network_interfaces;") + + result = Exqlite.Sqlite3.step(conn, statement) + {:row, rows} = result + iface = Enum.zip(columns, rows) |> Map.new() + + {:ok, _} = + %NetworkInterface{} + |> NetworkInterface.changeset(iface) + |> Repo.insert() + end + + def recover_old_configs do + sql_query = """ + SELECT configs.key, string_values.value FROM configs + INNER JOIN string_values on string_values.id = configs.string_value_id + WHERE value NOTNULL AND configs.group_id = 1; + """ + + {:ok, conn} = Exqlite.Sqlite3.open(@db_path) + {:ok, statement} = Exqlite.Sqlite3.prepare(conn, sql_query) + + 0..10 + |> Enum.map(fn _ -> Exqlite.Sqlite3.step(conn, statement) end) + |> Enum.reduce(%{}, fn + {:row, [key, value]}, acc -> Map.put(acc, key, value) + _step, acc -> acc + end) + |> Map.to_list() + |> Enum.map(fn {key, value} -> + FarmbotCore.Config.update_config_value( + :string, + "authorization", + key, + value + ) + end) + end +end diff --git a/farmbot_os/lib/farmbot_os/lua.ex b/lib/os/lua.ex similarity index 96% rename from farmbot_os/lib/farmbot_os/lua.ex rename to lib/os/lua.ex index e2ad80fe3..3d176a4bb 100644 --- a/farmbot_os/lib/farmbot_os/lua.ex +++ b/lib/os/lua.ex @@ -20,7 +20,7 @@ defmodule FarmbotOS.Lua do @doc "Logs an assertion based on it's result" def log_assertion(passed?, type, message) do meta = [assertion_passed: passed?, assertion_type: type] - FarmbotCore.Logger.dispatch_log(__ENV__, :assertion, 2, message, meta) + FarmbotCore.Logger.dispatch_log(:assertion, 2, message, meta) end # HACK: Provide an implicit "return", since many users @@ -54,7 +54,7 @@ defmodule FarmbotOS.Lua do reducer = fn args, vm -> apply(__MODULE__, :set_table, [vm | args]) end vm = Enum.reduce(extra_vm_args, init(), reducer) - case eval(vm, lua_code) do + case raw_eval(vm, lua_code) do {:ok, value} -> {:ok, value} @@ -151,8 +151,8 @@ defmodule FarmbotOS.Lua do :luerl.set_table(path, value, lua) end - @spec eval(t(), String.t()) :: {:ok, any()} | {:error, any()} - def eval(lua, hook) when is_binary(hook) do + @spec raw_eval(t(), String.t()) :: {:ok, any()} | {:error, any()} + def raw_eval(lua, hook) when is_binary(hook) do :luerl.eval(hook, lua) end diff --git a/farmbot_os/lib/farmbot_os/lua/data_manipulation.ex b/lib/os/lua/data_manipulation.ex similarity index 99% rename from farmbot_os/lib/farmbot_os/lua/data_manipulation.ex rename to lib/os/lua/data_manipulation.ex index 03dd5d5bd..48a2d25b6 100644 --- a/farmbot_os/lib/farmbot_os/lua/data_manipulation.ex +++ b/lib/os/lua/data_manipulation.ex @@ -7,7 +7,7 @@ defmodule FarmbotOS.Lua.DataManipulation do alias FarmbotCore.Asset.{Device, FbosConfig, FirmwareConfig} alias FarmbotOS.Lua.Util alias FarmbotOS.SysCalls.ResourceUpdate - alias FarmbotTelemetry.HTTP + alias FarmbotOS.HTTP alias FarmbotCore.Celery.SpecialValue @methods %{ diff --git a/farmbot_os/lib/farmbot_os/lua/firmware.ex b/lib/os/lua/firmware.ex similarity index 78% rename from farmbot_os/lib/farmbot_os/lua/firmware.ex rename to lib/os/lua/firmware.ex index fd7dee503..393caf2db 100644 --- a/farmbot_os/lib/farmbot_os/lua/firmware.ex +++ b/lib/os/lua/firmware.ex @@ -4,11 +4,11 @@ defmodule FarmbotOS.Lua.Firmware do """ @axis ["x", "y", "z"] - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue alias FarmbotCore.Firmware.Command def calibrate([axis], lua) when axis in @axis do - case SysCalls.calibrate(axis) do + case SysCallGlue.calibrate(axis) do :ok -> {[true], lua} @@ -18,7 +18,7 @@ defmodule FarmbotOS.Lua.Firmware do end def emergency_lock(_, lua) do - case SysCalls.emergency_lock() do + case SysCallGlue.emergency_lock() do :ok -> {[true], lua} @@ -28,7 +28,7 @@ defmodule FarmbotOS.Lua.Firmware do end def emergency_unlock(_, lua) do - case SysCalls.emergency_unlock() do + case SysCallGlue.emergency_unlock() do :ok -> {[true], lua} @@ -38,32 +38,32 @@ defmodule FarmbotOS.Lua.Firmware do end def find_home(["all"], lua), - do: do_find_home(@axis, lua, &SysCalls.find_home/1) + do: do_find_home(@axis, lua, &SysCallGlue.find_home/1) def find_home([axis], lua), - do: do_find_home([axis], lua, &SysCalls.find_home/1) + do: do_find_home([axis], lua, &SysCallGlue.find_home/1) def find_home([], lua), do: find_home(["all"], lua) def go_to_home([axis, speed], lua) when axis in @axis do defaults = %{ - "x" => SysCalls.get_current_x(), - "y" => SysCalls.get_current_y(), - "z" => SysCalls.get_current_z() + "x" => SysCallGlue.get_current_x(), + "y" => SysCallGlue.get_current_y(), + "z" => SysCallGlue.get_current_z() } mask = %{axis => 0} p = Map.merge(defaults, mask) args = Map.values(p) ++ [speed] - case apply(SysCalls, :move_absolute, args) do + case apply(SysCallGlue, :move_absolute, args) do :ok -> {[true], lua} {:error, reason} -> {[nil, reason], lua} end end def go_to_home(["all", speed], lua) do - case SysCalls.move_absolute(0, 0, 0, speed) do + case SysCallGlue.move_absolute(0, 0, 0, speed) do :ok -> {[true], lua} {:error, reason} -> {[nil, reason], lua} end @@ -85,7 +85,7 @@ defmodule FarmbotOS.Lua.Firmware do def move_absolute([x, y, z, speed], lua) when is_number(x) and is_number(y) and is_number(z) and is_number(speed) do - case SysCalls.move_absolute(x, y, z, speed) do + case SysCallGlue.move_absolute(x, y, z, speed) do :ok -> {[true], lua} @@ -101,7 +101,7 @@ defmodule FarmbotOS.Lua.Firmware do def move_absolute([table, speed], lua) when is_list(table) and is_number(speed) do axis_finder = fn - axis, {axis, nil} -> apply(SysCalls, :"get_current_#{axis}", []) + axis, {axis, nil} -> apply(SysCallGlue, :"get_current_#{axis}", []) axis, {axis, value} -> value _, {_axis, _value} -> false end @@ -123,7 +123,7 @@ defmodule FarmbotOS.Lua.Firmware do print("z", position.z); """ def get_position(["x"], lua) do - case SysCalls.get_current_x() do + case SysCallGlue.get_current_x() do x when is_number(x) -> {[x], lua} @@ -133,7 +133,7 @@ defmodule FarmbotOS.Lua.Firmware do end def get_position(["y"], lua) do - case SysCalls.get_current_y() do + case SysCallGlue.get_current_y() do y when is_number(y) -> {[y], lua} @@ -143,7 +143,7 @@ defmodule FarmbotOS.Lua.Firmware do end def get_position(["z"], lua) do - case SysCalls.get_current_z() do + case SysCallGlue.get_current_z() do z when is_number(z) -> {[z], lua} @@ -153,9 +153,9 @@ defmodule FarmbotOS.Lua.Firmware do end def get_position(_args, lua) do - with x when is_number(x) <- SysCalls.get_current_x(), - y when is_number(y) <- SysCalls.get_current_y(), - z when is_number(z) <- SysCalls.get_current_z() do + with x when is_number(x) <- SysCallGlue.get_current_x(), + y when is_number(y) <- SysCallGlue.get_current_y(), + z when is_number(z) <- SysCallGlue.get_current_z() do {[[{"x", x}, {"y", y}, {"z", z}]], lua} else {:error, reason} -> @@ -165,7 +165,7 @@ defmodule FarmbotOS.Lua.Firmware do def check_position([vec3, tolerance], lua) do axis_finder = fn - axis, {axis, nil} -> apply(SysCalls, :"get_current_#{axis}", []) + axis, {axis, nil} -> apply(SysCallGlue, :"get_current_#{axis}", []) axis, {axis, value} -> value _, {_axis, _value} -> false end @@ -174,9 +174,9 @@ defmodule FarmbotOS.Lua.Firmware do y = Enum.find_value(vec3, &axis_finder.("y", &1)) z = Enum.find_value(vec3, &axis_finder.("z", &1)) - with current_x when is_number(x) <- SysCalls.get_current_x(), - current_y when is_number(y) <- SysCalls.get_current_y(), - current_z when is_number(z) <- SysCalls.get_current_z() do + with current_x when is_number(x) <- SysCallGlue.get_current_x(), + current_y when is_number(y) <- SysCallGlue.get_current_y(), + current_z when is_number(z) <- SysCallGlue.get_current_z() do x_check = x >= current_x - tolerance and x <= current_x + tolerance y_check = y >= current_y - tolerance and y <= current_y + tolerance z_check = z >= current_z - tolerance and z <= current_z + tolerance @@ -205,7 +205,7 @@ defmodule FarmbotOS.Lua.Firmware do @options ["input", "input_pullup", "output"] def set_pin_io_mode([pin, mode], lua) when mode in @options do - result = SysCalls.set_pin_io_mode(pin, mode) + result = SysCallGlue.set_pin_io_mode(pin, mode) case result do :ok -> @@ -222,7 +222,7 @@ defmodule FarmbotOS.Lua.Firmware do end def write_pin([p, m, v], lua) do - case SysCalls.write_pin(trunc(p), parse_mode_string(m), trunc(v)) do + case SysCallGlue.write_pin(trunc(p), parse_mode_string(m), trunc(v)) do :ok -> {[], lua} {:error, error} -> {[inspect(error)], lua} end diff --git a/farmbot_os/lib/farmbot_os/lua/info.ex b/lib/os/lua/info.ex similarity index 95% rename from farmbot_os/lib/farmbot_os/lua/info.ex rename to lib/os/lua/info.ex index e5c279049..1be6e589a 100644 --- a/farmbot_os/lib/farmbot_os/lua/info.ex +++ b/lib/os/lua/info.ex @@ -3,7 +3,7 @@ defmodule FarmbotOS.Lua.Info do Lua extensions for gathering information about a running Farmbot """ - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue alias FarmbotOS.Lua.Util alias FarmbotCore.Config @@ -94,7 +94,7 @@ defmodule FarmbotOS.Lua.Info do end defp do_send_message(kind, message, channels, lua) do - result = SysCalls.send_message(kind, "#{message}", channels) + result = SysCallGlue.send_message(kind, "#{message}", channels) case result do :ok -> diff --git a/farmbot_os/lib/farmbot_os/lua/util.ex b/lib/os/lua/util.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/lua/util.ex rename to lib/os/lua/util.ex diff --git a/farmbot_os/lib/farmbot_os/lua/wait.ex b/lib/os/lua/wait.ex similarity index 68% rename from farmbot_os/lib/farmbot_os/lua/wait.ex rename to lib/os/lua/wait.ex index 91824dcba..0a13bc5a5 100644 --- a/farmbot_os/lib/farmbot_os/lua/wait.ex +++ b/lib/os/lua/wait.ex @@ -1,5 +1,5 @@ defmodule FarmbotOS.Lua.Wait do - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue @three_minutes 60 * 1000 * 3 @error "Do not use sleep for longer than three minutes." @@ -11,8 +11,8 @@ defmodule FarmbotOS.Lua.Wait do Process.sleep(wait) {[wait], lua} else - SysCalls.send_message("error", @error, ["toast"]) - SysCalls.emergency_lock() + SysCallGlue.send_message("error", @error, ["toast"]) + SysCallGlue.emergency_lock() {[], lua} end end diff --git a/lib/os/migrator.ex b/lib/os/migrator.ex new file mode 100644 index 000000000..714ab4f76 --- /dev/null +++ b/lib/os/migrator.ex @@ -0,0 +1,22 @@ +defmodule FarmbotOS.EctoMigrator do + require Logger + + def child_spec(_opts) do + %{ + id: __MODULE__, + start: {__MODULE__, :migrate, []}, + type: :worker, + restart: :transient, + shutdown: 500 + } + end + + @doc "Replacement for Mix.Tasks.Ecto.Migrate" + def migrate do + repo = FarmbotCore.Asset.Repo + migration_path = Path.join([:code.priv_dir(:farmbot), "repo", "migrations"]) + _ = Ecto.Migrator.run(repo, migration_path, :up, all: true) + Process.sleep(5000) + :ignore + end +end diff --git a/farmbot_os/lib/farmbot_os/platform_supervisor.ex b/lib/os/platform_supervisor.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/platform_supervisor.ex rename to lib/os/platform_supervisor.ex diff --git a/farmbot_os/lib/farmbot_os/sys_calls.ex b/lib/os/sys_calls.ex similarity index 98% rename from farmbot_os/lib/farmbot_os/sys_calls.ex rename to lib/os/sys_calls.ex index 8af6a58e3..b6fee83bb 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls.ex +++ b/lib/os/sys_calls.ex @@ -1,6 +1,6 @@ defmodule FarmbotOS.SysCalls do @moduledoc """ - Implementation for FarmbotCore.Celery.SysCalls + Implementation for FarmbotCore.Celery.SysCallGlue """ require FarmbotCore.Logger @@ -43,7 +43,7 @@ defmodule FarmbotOS.SysCalls do SetPinIOMode } - @behaviour FarmbotCore.Celery.SysCalls + @behaviour FarmbotCore.Celery.SysCallGlue @impl true defdelegate send_message(level, message, channels), to: SendMessage @@ -223,7 +223,7 @@ defmodule FarmbotOS.SysCalls do @impl true def emergency_unlock do Command.unlock() - FarmbotCore.Logger.busy(1, "Unlocked") + FarmbotCore.Logger.success(1, "Unlocked") Leds.yellow(:off) Leds.red(:solid) :ok diff --git a/farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex b/lib/os/sys_calls/change_ownership.ex similarity index 95% rename from farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex rename to lib/os/sys_calls/change_ownership.ex index 57ebc4fbe..8c348a139 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/change_ownership.ex +++ b/lib/os/sys_calls/change_ownership.ex @@ -4,7 +4,6 @@ defmodule FarmbotOS.SysCalls.ChangeOwnership do require Logger require FarmbotCore.Logger import FarmbotCore.Config, only: [get_config_value: 3, update_config_value: 4] - alias FarmbotCore.{Asset, EctoMigrator} alias FarmbotExt.Bootstrap.Authorization defmodule Support do @@ -24,7 +23,7 @@ defmodule FarmbotOS.SysCalls.ChangeOwnership do end def clean_assets do - EctoMigrator.drop(Asset.Repo) + raise "TODO: Drop assets" :ok end end diff --git a/farmbot_os/lib/farmbot_os/sys_calls/check_update.ex b/lib/os/sys_calls/check_update.ex similarity index 96% rename from farmbot_os/lib/farmbot_os/sys_calls/check_update.ex rename to lib/os/sys_calls/check_update.ex index 5ada0f726..1ea9baeca 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/check_update.ex +++ b/lib/os/sys_calls/check_update.ex @@ -31,7 +31,7 @@ defmodule FarmbotOS.SysCalls.CheckUpdate do def done(progress_pid) do UpdateProgress.set(progress_pid, 100) - FarmbotCore.Celery.SysCalls.reboot() + FarmbotCore.Celery.SysCallGlue.reboot() end # Try to find the upgrade image URL (might be `nil`) diff --git a/farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex b/lib/os/sys_calls/factory_reset.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/sys_calls/factory_reset.ex rename to lib/os/sys_calls/factory_reset.ex diff --git a/farmbot_os/lib/farmbot_os/sys_calls/farmware.ex b/lib/os/sys_calls/farmware.ex similarity index 94% rename from farmbot_os/lib/farmbot_os/sys_calls/farmware.ex rename to lib/os/sys_calls/farmware.ex index 33ba50a4d..8d691dfd4 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/farmware.ex +++ b/lib/os/sys_calls/farmware.ex @@ -2,13 +2,13 @@ defmodule FarmbotOS.SysCalls.Farmware do @moduledoc false require FarmbotCore.Logger - alias FarmbotCore.{Asset, AssetSupervisor, FarmwareRuntime} + alias FarmbotCore.{Asset, ChangeSupervisor, FarmwareRuntime} alias FarmbotExt.API.ImageUploader @farmware_timeout 1_200_000 def update_farmware(farmware_name) do with {:ok, installation} <- lookup_installation(farmware_name) do - AssetSupervisor.cast_child(installation, :update) + ChangeSupervisor.cast_child(installation, :update) else {:error, reason} when is_binary(reason) -> {:error, reason} diff --git a/farmbot_os/lib/farmbot_os/sys_calls/movement.ex b/lib/os/sys_calls/movement.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/sys_calls/movement.ex rename to lib/os/sys_calls/movement.ex diff --git a/farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex b/lib/os/sys_calls/pin_control.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/sys_calls/pin_control.ex rename to lib/os/sys_calls/pin_control.ex diff --git a/farmbot_os/lib/farmbot_os/sys_calls/point_lookup.ex b/lib/os/sys_calls/point_lookup.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/sys_calls/point_lookup.ex rename to lib/os/sys_calls/point_lookup.ex diff --git a/farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex b/lib/os/sys_calls/resource_update.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/sys_calls/resource_update.ex rename to lib/os/sys_calls/resource_update.ex diff --git a/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex b/lib/os/sys_calls/send_message.ex similarity index 96% rename from farmbot_os/lib/farmbot_os/sys_calls/send_message.ex rename to lib/os/sys_calls/send_message.ex index 350695632..75f6701a1 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls/send_message.ex +++ b/lib/os/sys_calls/send_message.ex @@ -13,7 +13,7 @@ defmodule FarmbotOS.SysCalls.SendMessage do case render(templ) do {:ok, message} -> - FarmbotCore.Logger.dispatch_log(__ENV__, type, 1, message, meta) + FarmbotCore.Logger.dispatch_log(type, 1, message, meta) # Give LogChannel time to catch up and ingest logs. # Removing this line will result in non-deterministic # loss of duplicate logs or general "funny business" diff --git a/farmbot_os/lib/farmbot_os/sys_calls/set_pin_io_mode.ex b/lib/os/sys_calls/set_pin_io_mode.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/sys_calls/set_pin_io_mode.ex rename to lib/os/sys_calls/set_pin_io_mode.ex diff --git a/farmbot_os/lib/farmbot_os/system.ex b/lib/os/system.ex similarity index 79% rename from farmbot_os/lib/farmbot_os/system.ex rename to lib/os/system.ex index a256a4219..c8e9b0198 100644 --- a/farmbot_os/lib/farmbot_os/system.ex +++ b/lib/os/system.ex @@ -23,19 +23,7 @@ defmodule FarmbotOS.System do Logger.info("Stopping app: :farmbot") _ = Application.stop(:farmbot) - Logger.info("Stopping app: :farmbot_ext") - _ = Application.stop(:farmbot_ext) - - Logger.info("Stopping app: :farmbot_core") - _ = Application.stop(:farmbot_core) - - Logger.info("Starting ap: :farmbot_core") - _ = Application.ensure_all_started(:farmbot_core) - - Logger.info("Starting ap: :farmbot_ext") - _ = Application.ensure_all_started(:farmbot_ext) - - Logger.info("Starting ap: :farmbot") + Logger.info("Starting app: :farmbot") _ = Application.ensure_all_started(:farmbot) end @@ -52,7 +40,7 @@ defmodule FarmbotOS.System do def factory_reset(reason, _ \\ nil) do try_lock_fw() set_shutdown_reason(reason) - _ = FarmbotCore.EctoMigrator.drop() + IO.puts("TODO: FarmbotCore.EctoMigrator.drop()") reboot(reason) :ok end diff --git a/farmbot_os/lib/farmbot_os/update_progress.ex b/lib/os/update_progress.ex similarity index 100% rename from farmbot_os/lib/farmbot_os/update_progress.ex rename to lib/os/update_progress.ex diff --git a/farmbot_os/lib/farmbot_os/update_support.ex b/lib/os/update_support.ex similarity index 93% rename from farmbot_os/lib/farmbot_os/update_support.ex rename to lib/os/update_support.ex index 7d70ee777..393d5d233 100644 --- a/farmbot_os/lib/farmbot_os/update_support.ex +++ b/lib/os/update_support.ex @@ -38,7 +38,7 @@ defmodule FarmbotOS.UpdateSupport do params = {to_charlist(url), []} {:ok, :saved_to_file} = - FarmbotTelemetry.HTTP.request(:get, params, [], stream: @dl_path) + FarmbotOS.HTTP.request(:get, params, [], stream: @dl_path) end # Crash the current process if there is already an OTA in @@ -71,7 +71,7 @@ defmodule FarmbotOS.UpdateSupport do end end - # FarmbotTelemetry.HTTP callback when a JSON download succeeds (/api/releases?platform=foo) + # FarmbotOS.HTTP callback when a JSON download succeeds (/api/releases?platform=foo) def handle_http_response({:ok, {{_, 200, _}, _response_headers, body}}) do {:ok, map} = JSON.decode(body) map @@ -98,7 +98,7 @@ defmodule FarmbotOS.UpdateSupport do url = calculate_url(target) t = FarmbotCore.Config.get_config_value(:string, "authorization", "token") params = {to_charlist(url), [{'Authorization', to_charlist(t)}]} - http_resp = FarmbotTelemetry.HTTP.request(:get, params, [], []) + http_resp = FarmbotOS.HTTP.request(:get, params, [], []) handle_http_response(http_resp) end diff --git a/farmbot_telemetry/lib/farmbot_telemetry/application.ex b/lib/telemetry/application.ex similarity index 80% rename from farmbot_telemetry/lib/farmbot_telemetry/application.ex rename to lib/telemetry/application.ex index 0f357bef6..ac7538502 100644 --- a/farmbot_telemetry/lib/farmbot_telemetry/application.ex +++ b/lib/telemetry/application.ex @@ -6,7 +6,7 @@ defmodule FarmbotTelemetry.Application do use Application def config do - user_defined = Application.get_all_env(:farmbot_telemetry) + user_defined = Application.get_all_env(:farmbot) Keyword.merge( [access: :read_write, type: :set, file: '/tmp/farmbot_telemetry.dets'], @@ -15,7 +15,7 @@ defmodule FarmbotTelemetry.Application do end def start(_type, _args) do - {:ok, :farmbot_telemetry} = :dets.open_file(:farmbot_telemetry, config()) + {:ok, :farmbot} = :dets.open_file(:farmbot, config()) children = [] # See https://hexdocs.pm/elixir/Supervisor.html diff --git a/farmbot_telemetry/lib/farmbot_telemetry/http.ex b/lib/telemetry/http.ex similarity index 94% rename from farmbot_telemetry/lib/farmbot_telemetry/http.ex rename to lib/telemetry/http.ex index e87a7237b..fb2219a9c 100644 --- a/farmbot_telemetry/lib/farmbot_telemetry/http.ex +++ b/lib/telemetry/http.ex @@ -1,4 +1,4 @@ -defmodule FarmbotTelemetry.HTTP do +defmodule FarmbotOS.HTTP do @moduledoc """ A very thin wrapper around :httpc and :hackney to facilitate mocking and set system-wide default configuration. diff --git a/mix.exs b/mix.exs index ff0fa904b..c12a134e2 100644 --- a/mix.exs +++ b/mix.exs @@ -1,49 +1,169 @@ -defmodule FarmbotSupport.MixProject do - ################################################################################ - ###### WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ###### - ###### This is not the root mix.exs the farmbot application ###### - ###### This OTP application is for test support only. ###### - ###### WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING ###### - ################################################################################ - +defmodule FarmbotOS.MixProject do use Mix.Project - @version Path.join([__DIR__, "VERSION"]) |> File.read!() |> String.trim() - @elixir_version Path.join([__DIR__, "ELIXIR_VERSION"]) |> File.read!() |> String.trim() + + @all_targets [:rpi3, :rpi] + @version Path.join([__DIR__, "VERSION"]) + |> File.read!() + |> String.trim() + @branch System.cmd("git", ~w"rev-parse --abbrev-ref HEAD") + |> elem(0) + |> String.trim() + @commit System.cmd("git", ~w"rev-parse --verify HEAD") + |> elem(0) + |> String.trim() + System.put_env("NERVES_FW_VCS_IDENTIFIER", @commit) + System.put_env("NERVES_FW_MISC", @branch) + + @elixir_version Path.join([__DIR__, "ELIXIR_VERSION"]) + |> File.read!() + |> String.trim() + + System.put_env("NERVES_FW_VCS_IDENTIFIER", @commit) def project do [ - app: :farmbot_support, - version: @version, + aliases: aliases(), + app: :farmbot, + archives: [nerves_bootstrap: "~> 1.10"], + branch: @branch, + build_embedded: false, + build_path: "_build/#{Mix.target()}", + commit: @commit, + compilers: Mix.compilers(), + deps_path: "deps/#{Mix.target()}", + deps: deps(), + description: "The Brains of the Farmbot Project", + docs: [ + logo: "../farmbot_os/priv/static/farmbot_logo.png", + extras: Path.wildcard("../docs/**/*.md") + ], elixir: @elixir_version, - elixirc_options: [warnings_as_errors: true, ignore_module_conflict: true], - start_permanent: Mix.env() == :prod, - elixirc_paths: ["support"], - test_coverage: [tool: ExCoveralls], + elixirc_options: [warnings_as_errors: true], + elixirc_paths: elixirc_paths(Mix.env(), Mix.target()), + homepage_url: "http://farmbot.io", preferred_cli_env: [ - test: :test, coveralls: :test, - "coveralls.circle": :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test ], - deps: deps() + preferred_cli_target: [run: :host, test: :host], + releases: [{:farmbot, release()}], + source_url: "https://github.com/Farmbot/farmbot_os", + start_permanent: Mix.env() == :prod, + target: Mix.target(), + test_coverage: [tool: ExCoveralls], + version: @version + ] + end + + def release do + [ + overwrite: true, + cookie: "democookie", + include_erts: &Nerves.Release.erts/0, + strip_beams: false, + steps: [&Nerves.Release.init/1, :assemble] ] end + # Starting nerves_bootstrap adds the required aliases to Mix.Project.config() + # Aliases are only added if MIX_TARGET is set. + def bootstrap(args) do + Application.start(:nerves_bootstrap) + Mix.Task.run("loadconfig", args) + end + # Run "mix help compile.app" to learn about applications. def application do [ - extra_applications: [:logger] + mod: {FarmbotOS, []}, + extra_applications: [ + :certifi, + :crypto, + :eex, + :inets, + :logger, + :public_key, + :rollbax, + :runtime_tools, + :ssh + ] ] end # Run "mix help deps" to learn about dependencies. defp deps do [ - {:jason, "~> 1.2.2"}, - {:excoveralls, "~> 0.14.2", only: [:test], targets: [:host]}, - {:ex_doc, "~> 0.25.3", only: [:dev], targets: [:host], runtime: false} + {:busybox, "~> 0.1.5", targets: @all_targets}, + {:certifi, "~> 2.8"}, + {:circuits_gpio, "~> 1.0", targets: @all_targets}, + {:circuits_i2c, "~> 1.0", targets: @all_targets}, + {:circuits_uart, "~> 1.4"}, + {:cors_plug, "~> 2.0.3", targets: @all_targets}, + {:dns, "~> 2.3"}, + {:ecto_sqlite3, "~> 0.7.2"}, + {:ecto, "~> 3.7"}, + {:ex_doc, "~> 0.25", only: [:dev], targets: [:host], runtime: false}, + {:excoveralls, "~> 0.14", only: [:test], targets: [:host]}, + {:extty, "~> 0.2.1"}, + {:farmbot_system_rpi, + git: "https://github.com/FarmBot/farmbot_system_rpi.git", + ref: "v1.16.2-farmbot.1", + runtime: false, + targets: :rpi}, + {:farmbot_system_rpi3, + git: "https://github.com/FarmBot/farmbot_system_rpi3.git", + tag: "v1.16.2-farmbot.1", + runtime: false, + targets: :rpi3}, + {:hackney, "~> 1.18"}, + {:jason, "~> 1.2"}, + {:luerl, github: "rvirding/luerl", tag: "1.0"}, + {:mdns_lite, "~> 0.8", targets: @all_targets}, + {:mimic, "~> 1.5", only: :test}, + {:muontrap, "~> 0.6"}, + {:nerves_firmware_ssh, "~> 0.4.6", targets: @all_targets}, + {:nerves_runtime, "~> 0.11.6", targets: @all_targets}, + {:nerves_time, "~> 0.4", targets: @all_targets}, + {:nerves, "~> 1.7.11", runtime: false}, + {:phoenix_html, "~> 2.14.3"}, + {:plug_cowboy, "~> 2.5.2"}, + {:ring_logger, "~> 0.8.2"}, + {:rollbax, ">= 0.0.0"}, + {:shoehorn, "~> 0.7"}, + {:telemetry, "~> 1.0.0"}, + {:tesla, "~> 1.4.3"}, + {:timex, "~> 3.7"}, + {:toolshed, "~> 0.2.22", targets: @all_targets}, + {:tortoise, "~> 0.10"}, + {:uuid, "~> 1.1.8"}, + {:vintage_net_ethernet, "~> 0.10.1", targets: @all_targets}, + {:vintage_net_wifi, "~> 0.10.1", targets: @all_targets}, + {:vintage_net, "~> 0.11", targets: @all_targets} + ] + end + + defp elixirc_paths(:test, _) do + ["./lib", "./platform/host", "./test"] + end + + defp elixirc_paths(_, :host) do + ["./lib", "./platform/host"] + end + + defp elixirc_paths(_env, _target) do + ["./lib", "./platform/target"] + end + + def aliases do + [ + loadconfig: [&bootstrap/1], + test: [ + "ecto.drop", + "ecto.migrate", + "test" + ] ] end end diff --git a/mix.lock b/mix.lock index 91b944b4a..0f9e9a75d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,21 +1,108 @@ %{ + "amqp": {:hex, :amqp, "1.6.0", "736d976f53780bcee72ccc50f7eb36e3d5881354480b1e34ceac84e3bbd954e9", [:mix], [{:amqp_client, "~> 3.8.0", [hex: :amqp_client, repo: "hexpm", optional: false]}], "hexpm", "b8168919ea1f1571a68349421e6501d1db7f559c4db3b8324ae90dbd3e2c1c4a"}, + "amqp_client": {:hex, :amqp_client, "3.8.9", "42fb24cfa606f87f77e84604c1ad896c26c236228196a294a07f88f8d2982695", [:make, :rebar3], [{:rabbit_common, "3.8.9", [hex: :rabbit_common, repo: "hexpm", optional: false]}], "hexpm", "8ad70be479d2b8c7882aa2908245b490960fe5c619d2edd56eb24f90e1132b60"}, + "beam_notify": {:hex, :beam_notify, "0.2.2", "5c6cc0d12ef0f08aa063704c11f7c0ffd77123ccae5bd6f6827e704a4c860868", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "75c5606bf772c26340e0afacfb435f8265e8ad22ef270d492ff7b07d9b74260b"}, + "busybox": {:hex, :busybox, "0.1.5", "a86e8007469d9422c8c7808c2d978688f60e42c77b14f2a849bc4a1223729a8b", [:make, :mix], [{:elixir_make, "~> 0.5", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4da1fd2e47ea25a744506520241b201302fef841833a7cb0ed4dace94be23d9f"}, "certifi": {:hex, :certifi, "2.8.0", "d4fb0a6bb20b7c9c3643e22507e42f356ac090a1dcea9ab99e27e0376d695eba", [:rebar3], [], "hexpm", "6ac7efc1c6f8600b08d625292d4bbf584e14847ce1b6b5c44d983d273e1097ea"}, - "dialyxir": {:hex, :dialyxir, "1.0.0-rc.7", "6287f8f2cb45df8584317a4be1075b8c9b8a69de8eeb82b4d9e6c761cf2664cd", [:mix], [{:erlex, ">= 0.2.5", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "506294d6c543e4e5282d4852aead19ace8a35bedeb043f9256a06a6336827122"}, - "earmark": {:hex, :earmark, "1.4.1", "07bb382826ee8d08d575a1981f971ed41bd5d7e86b917fd012a93c51b5d28727", [:mix], [], "hexpm", "cdfa03374331187c7b9e86d971423a19138dc1cf9902b26923a657c789673876"}, - "earmark_parser": {:hex, :earmark_parser, "1.4.15", "b29e8e729f4aa4a00436580dcc2c9c5c51890613457c193cc8525c388ccb2f06", [:mix], [], "hexpm", "044523d6438ea19c1b8ec877ec221b008661d3c27e3b848f4c879f500421ca5c"}, - "erlex": {:hex, :erlex, "0.2.5", "e51132f2f472e13d606d808f0574508eeea2030d487fc002b46ad97e738b0510", [:mix], [], "hexpm", "756d3e19b056339af674b715fdd752c5dac468cf9d0e2d1a03abf4574e99fbf8"}, - "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, - "excoveralls": {:hex, :excoveralls, "0.14.3", "d17dc249ad32e469afd2bc656b58e810109d4367ec6bd467bed57a84dc4a3e02", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "b5aecdfdcf48e9d5e1c210841589b30981a5e7e66055cb8691a6f90b1601c108"}, + "circuits_gpio": {:hex, :circuits_gpio, "1.0.0", "b2a493b1822ec712bfba7068a016930f6db5e31713b9b84ed8bc307c7c323682", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "da64c1d9ba1329cd7ca7e63adcd68d73e2294d6b48eb66c9a1064f3db5c523f3"}, + "circuits_i2c": {:hex, :circuits_i2c, "1.0.0", "0b9c686ff5075f9364209fef62f6b5162eeb41a0061571f52f02637b40ca37fe", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f80efc49235e7819b9ea8e82c7dbd5e2523c65d8e3d4f46f89dfd43217a3f4f7"}, + "circuits_uart": {:hex, :circuits_uart, "1.4.3", "3753ed5b8792bab65f3e3c9c4ef00c51bcd5af7bb504bdfcba0648cb9b37e0de", [:mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "80e568af4144ebf060af19d9354a545f96fe1ac069d91ac852ee9f2cee8af581"}, + "circular_buffer": {:hex, :circular_buffer, "0.4.0", "a51ea76bb03c4a38207934264bcc600018ead966728ca80da731458c5f940f8b", [:mix], [], "hexpm", "c604b19f2101982b63264e2ed90c6fb0fe502540b6af83ce95135ac9b6f2d847"}, + "combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"}, + "connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"}, + "cors_plug": {:hex, :cors_plug, "2.0.3", "316f806d10316e6d10f09473f19052d20ba0a0ce2a1d910ddf57d663dac402ae", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ee4ae1418e6ce117fc42c2ba3e6cbdca4e95ecd2fe59a05ec6884ca16d469aea"}, + "cowboy": {:hex, :cowboy, "2.9.0", "865dd8b6607e14cf03282e10e934023a1bd8be6f6bacf921a7e2a96d800cd452", [:make, :rebar3], [{:cowlib, "2.11.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "1.8.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "2c729f934b4e1aa149aff882f57c6372c15399a20d54f65c8d67bef583021bde"}, + "cowboy_telemetry": {:hex, :cowboy_telemetry, "0.4.0", "f239f68b588efa7707abce16a84d0d2acf3a0f50571f8bb7f56a15865aae820c", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7d98bac1ee4565d31b62d59f8823dfd8356a169e7fcbb83831b8a5397404c9de"}, + "cowlib": {:hex, :cowlib, "2.11.0", "0b9ff9c346629256c42ebe1eeb769a83c6cb771a6ee5960bd110ab0b9b872063", [:make, :rebar3], [], "hexpm", "2b3e9da0b21c4565751a6d4901c20d1b4cc25cbb7fd50d91d2ab6dd287bc86a9"}, + "credentials_obfuscation": {:hex, :credentials_obfuscation, "2.2.0", "f8040672ff9644ccaefc40ffb8ec33ed80ac77df84ac5f206a1c079ca2aacc9d", [:rebar3], [], "hexpm", "52dd8585a2123e6e259253a7f4f849f1584404bd25cdfaf18247e198065c601e"}, + "db_connection": {:hex, :db_connection, "2.4.1", "6411f6e23f1a8b68a82fa3a36366d4881f21f47fc79a9efb8c615e62050219da", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ea36d226ec5999781a9a8ad64e5d8c4454ecedc7a4d643e4832bf08efca01f00"}, + "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, + "dialyxir": {:hex, :dialyxir, "1.0.0-rc.6", "78e97d9c0ff1b5521dd68041193891aebebce52fc3b93463c0a6806874557d7d", [:mix], [{:erlex, "~> 0.2.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "49496d63267bc1a4614ffd5f67c45d9fc3ea62701a6797975bc98bc156d2763f"}, + "dns": {:hex, :dns, "2.3.0", "3e750cf3e229898628a091fa7dca29524294db2962d0fc15696ac3a5cfff2315", [:mix], [{:socket, "~> 0.3.13", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm", "f3f1074409b4ecf6f93379a49fb0aef30a898f3093ea22b5c64a85e9f99ca6f8"}, + "earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"}, + "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, + "ecto": {:hex, :ecto, "3.7.1", "a20598862351b29f80f285b21ec5297da1181c0442687f9b8329f0445d228892", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d36e5b39fc479e654cffd4dbe1865d9716e4a9b6311faff799b6f90ab81b8638"}, + "ecto_sql": {:hex, :ecto_sql, "3.7.1", "8de624ef50b2a8540252d8c60506379fbbc2707be1606853df371cf53df5d053", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "2b42a32e2ce92f64aba5c88617891ab3b0ba34f3f3a503fa20009eae1a401c81"}, + "ecto_sqlite3": {:hex, :ecto_sqlite3, "0.7.2", "667338c1e0f7af13f75ab9eec13afcea216eb71dac9daf7897c8f0acc8b5722b", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.7", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:exqlite, "~> 0.6", [hex: :exqlite, repo: "hexpm", optional: false]}], "hexpm", "b003804132f183d1d6dc759f6c2ccc60c1fb5d62e1db4aa4fe0d38577096f7c4"}, + "elixir_make": {:hex, :elixir_make, "0.6.3", "bc07d53221216838d79e03a8019d0839786703129599e9619f4ab74c8c096eac", [:mix], [], "hexpm", "f5cbd651c5678bcaabdbb7857658ee106b12509cd976c2c2fca99688e1daf716"}, + "erlex": {:hex, :erlex, "0.2.2", "cb0e6878fdf86dc63509eaf2233a71fa73fc383c8362c8ff8e8b6f0c2bb7017c", [:mix], [], "hexpm", "423a8f6ac70b77f0001c18adbff2b10413afed6901c2975aa33151a9c1263307"}, + "esqlite": {:hex, :esqlite, "0.2.5", "cab6d87aeb5f33d848b9bb8a21129e9512ea608f930d4c63576942d8f7d72218", [:rebar3], [], "hexpm", "3dd1163c8807b24a05ec4d88fd0f1bb286a2640ed340898fd792e3a67bb70f10"}, + "ex_doc": {:hex, :ex_doc, "0.25.5", "ac3c5425a80b4b7c4dfecdf51fa9c23a44877124dd8ca34ee45ff608b1c6deb9", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "688cfa538cdc146bc4291607764a7f1fcfa4cce8009ecd62de03b27197528350"}, + "excoveralls": {:hex, :excoveralls, "0.14.4", "295498f1ae47bdc6dce59af9a585c381e1aefc63298d48172efaaa90c3d251db", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e3ab02f2df4c1c7a519728a6f0a747e71d7d6e846020aae338173619217931c1"}, + "exqlite": {:hex, :exqlite, "0.7.9", "d4c06b8617fd5515c53b99a6cc2471a73a78c8804ea2fb2903ae559de6e0e1e8", [:make, :mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "5e9da2e0b1d1e3270f6f92e93ae7d78a51af05ec52cde07403c0a67aafe437fe"}, + "extty": {:hex, :extty, "0.2.1", "4da6d78d41f0a9ff9980d82968476b4277ac0afa227d2ed91af0ffcbac2f451b", [:mix], [], "hexpm", "26b2e495c14501d4ae24c7dffba199f6abf0a0f69dcfd07db62f421952442f05"}, + "farmbot_system_rpi": {:git, "https://github.com/FarmBot/farmbot_system_rpi.git", "6a6117d8c1dacc1d2f6a4ba1363436f2a4e62ad3", [ref: "v1.16.2-farmbot.1"]}, + "farmbot_system_rpi3": {:git, "https://github.com/FarmBot/farmbot_system_rpi3.git", "ae7d4459e3e40d35ec2367554618f8f92d2d3c2e", [tag: "v1.16.2-farmbot.1"]}, + "fwup": {:hex, :fwup, "0.3.0", "2c360815565fcbc945ebbb34b58f156efacb7f8d64766f1cb3426919bb3f41ea", [:mix], [], "hexpm", "d12990ebda7d485d0eb7502df7aa9a56e66f67b5eda158c352db1de48e3f0518"}, + "gen_state_machine": {:hex, :gen_state_machine, "3.0.0", "1e57f86a494e5c6b14137ebef26a7eb342b3b0070c7135f2d6768ed3f6b6cdff", [:mix], [], "hexpm", "0a59652574bebceb7309f6b749d2a41b45fdeda8dbb4da0791e355dd19f0ed15"}, + "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, + "goldrush": {:hex, :goldrush, "0.1.9", "f06e5d5f1277da5c413e84d5a2924174182fb108dabb39d5ec548b27424cd106", [:rebar3], [], "hexpm", "99cb4128cffcb3227581e5d4d803d5413fa643f4eb96523f77d9e6937d994ceb"}, "hackney": {:hex, :hackney, "1.18.0", "c4443d960bb9fba6d01161d01cd81173089686717d9490e5d3606644c48d121f", [:rebar3], [{:certifi, "~>2.8.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "9afcda620704d720db8c6a3123e9848d09c87586dc1c10479c42627b905b5c5e"}, "idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"}, "jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"}, + "jsx": {:hex, :jsx, "2.11.0", "08154624050333919b4ac1b789667d5f4db166dc50e190c4d778d1587f102ee0", [:rebar3], [], "hexpm", "eed26a0d04d217f9eecefffb89714452556cf90eb38f290a27a4d45b9988f8c0"}, + "lager": {:hex, :lager, "3.8.0", "3402b9a7e473680ca179fc2f1d827cab88dd37dd1e6113090c6f45ef05228a1c", [:rebar3], [{:goldrush, "0.1.9", [hex: :goldrush, repo: "hexpm", optional: false]}], "hexpm", "f6cb541b688eab60730d8d286eb77256a5a9ad06eac10d43beaf55d07e68bbb6"}, + "luer": {:git, "https://github.com/rvirding/luerl.git", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, + "luerl": {:git, "https://github.com/rvirding/luerl.git", "836d08ad3287d73d9c91cb11a590de15a1761027", [tag: "1.0"]}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, - "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, + "makeup_elixir": {:hex, :makeup_elixir, "0.15.2", "dc72dfe17eb240552857465cc00cce390960d9a0c055c4ccd38b70629227e97c", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "fd23ae48d09b32eff49d4ced2b43c9f086d402ee4fd4fcb2d7fad97fa8823e75"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, + "mdns_lite": {:hex, :mdns_lite, "0.8.3", "41ec5b6532a77737086f83b7ecd0a710bb2fe426221002d9b5ca9f279367a53c", [:mix], [{:vintage_net, "~> 0.7", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "d094a453e7c7c3167ab85257aeb69a7c534d905dfbe0df7b0f98ff2e509aac78"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, + "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "mimic": {:hex, :mimic, "1.5.1", "085f7ebfeb5b579a13a167aec3c712d71fecfc6cb8b298c0dd3056f97ea2c2a0", [:mix], [], "hexpm", "33a50ef9ff38f8f24b2586d52e529981a3ba2b8d061c872084aff0e993bf4bd5"}, + "mox": {:hex, :mox, "0.5.1", "f86bb36026aac1e6f924a4b6d024b05e9adbed5c63e8daa069bd66fb3292165b", [:mix], [], "hexpm"}, + "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, + "nerves": {:hex, :nerves, "1.7.11", "67820b7055b541ce20f7bce40672a06268673ba8c47576a76e703d537a136a74", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "79535d00928c81a93ea5311497b00f0ca7bc0a8aa405134d16597a02b2616e89"}, + "nerves_firmware_ssh": {:hex, :nerves_firmware_ssh, "0.4.6", "6f46f3af9698aa3683c7b98d444771efbce357b42d81de44e1076d99ccac8778", [:mix], [{:nerves_runtime, "~> 0.6", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm", "6c2be4c832160bcb90ade8e0d056d9d18d42306545cee3c52b25cb9865abcab5"}, + "nerves_hub": {:hex, :nerves_hub, "0.7.4", "0e104cad468c3d601ed423e116ea3422fbd31b7eedb263bcb2a5c489dca8b53b", [:mix], [{:fwup, "~> 0.3.0", [hex: :fwup, repo: "hexpm", optional: false]}, {:hackney, "~> 1.10", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:nerves_hub_cli, "~> 0.9", [hex: :nerves_hub_cli, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: false]}, {:phoenix_client, "~> 0.7", [hex: :phoenix_client, repo: "hexpm", optional: false]}, {:websocket_client, "~> 1.3", [hex: :websocket_client, repo: "hexpm", optional: false]}, {:x509, "~> 0.5", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "af1daf7e879f1175c9db1957340b1773f11a00e1c63eb591427d1bf7f3d40b47"}, + "nerves_hub_cli": {:hex, :nerves_hub_cli, "0.9.0", "ee02d6a4ce7706b7860df925a5a578c0856757123d7df56dfb38f85818f80aba", [:mix], [{:nerves_hub_user_api, "~> 0.6", [hex: :nerves_hub_user_api, repo: "hexpm", optional: false]}, {:pbcs, "~> 0.1", [hex: :pbcs, repo: "hexpm", optional: false]}, {:table_rex, "~> 2.0.0", [hex: :table_rex, repo: "hexpm", optional: false]}, {:x509, "~> 0.3", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "0d0c2cf36c8e784534d6ba916587cbc282b00d317b577e8b2972eccd5ffe6314"}, + "nerves_hub_user_api": {:hex, :nerves_hub_user_api, "0.6.0", "14f7bd249275c647981e6601ebef909fd4036391aef010ff74d01d4799b90bdf", [:mix], [{:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:tesla, "~> 1.2.1 or ~> 1.3", [hex: :tesla, repo: "hexpm", optional: false]}, {:x509, "~> 0.3", [hex: :x509, repo: "hexpm", optional: false]}], "hexpm", "de682a5f5302d1f602a92f82fe2380abd658640ca25f620a8e9854e883020ea0"}, + "nerves_runtime": {:hex, :nerves_runtime, "0.11.7", "eb4af57fbae6705d8edf7764173d860aa136d8df1b123f235b0754859e43c1c1", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.8.0", [hex: :system_registry, repo: "hexpm", optional: false]}, {:uboot_env, "~> 0.1.1 or ~> 0.2.0 or ~> 0.3.0", [hex: :uboot_env, repo: "hexpm", optional: false]}], "hexpm", "68a6f93f4c73b05c0a7dccb6cb6e7624aad3fcbd4a6dfbe27233a1fef572ab65"}, + "nerves_system_br": {:hex, :nerves_system_br, "1.16.5", "8355a1d10cbcbb349623394b775acdcd5e874cd6ec9d1e1b0a5380018c29f6d1", [:mix], [], "hexpm", "a5e8dd4a308f09a06f3b1e47cbcec79cb31d0641349bba69437e98a05468896f"}, + "nerves_system_linter": {:hex, :nerves_system_linter, "0.3.0", "84e0f63c8ac196b16b77608bbe7df66dcf352845c4e4fb394bffd2b572025413", [:mix], [], "hexpm", "bffbdfb116bc72cde6e408c34c0670b199846e9a8f0953cc1c9f1eea693821a1"}, + "nerves_time": {:hex, :nerves_time, "0.4.3", "c936ddf7f1f9eb890c8dfcf116f5ac665780351704066282bed15fe6d2cf9b1b", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "a8a7d6e129e90ce35296d0e3522580335da8a0413790ad27c33bcea0cb63c4e5"}, + "nerves_toolchain_armv6_nerves_linux_gnueabihf": {:hex, :nerves_toolchain_armv6_nerves_linux_gnueabihf, "1.4.3", "c75a3975388c3378deb72ed50178f34f8cc47b575b32546d22e522a577f6b8c0", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.8.4", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm", "33e3a174ff51f81bca3181560d33c065694828e8c8c72aada0b92a46ba7cfbe5"}, + "nerves_toolchain_armv7_nerves_linux_gnueabihf": {:hex, :nerves_toolchain_armv7_nerves_linux_gnueabihf, "1.4.3", "ff5b8fed2a71daea7ac07a5a0a6ecec7a4985d2a617a89ab073591d441d9cda4", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.8.4", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm", "ffefca61b7282a5a10032e61b6dab6758d24eee732c5d8c16fe6aada52dd099a"}, + "nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.8.4", "2f6b4153e3904502d117f9d957c12eaafd490e1d2bdf20a85328ada46a1350da", [:mix], [{:nerves, "~> 1.0", [hex: :nerves, repo: "hexpm", optional: false]}], "hexpm", "6194be9b1364fdc1db6b2a0e98fa8dcb94fe1af373dcf8149298d62ce9b1b369"}, + "nimble_csv": {:hex, :nimble_csv, "0.6.0", "a3673f26d41f986774fe6060e309615343d3cb83a6d435754d8b1fdbd5764879", [:mix], [], "hexpm", "b78e15f1c82fd963745ecc4073c47e1f0cdaf3622143342b8c30e9b5eaa546c6"}, "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, + "one_dhcpd": {:hex, :one_dhcpd, "0.2.5", "ecec86e567839bde69717abb24c1ae5c74fcdc71beccfce541a0c3149aa980a4", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4d59693a9998c7dfd6d9f06c556ff23c73c817832f812205a6f09d38250b6dfa"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, + "pbcs": {:hex, :pbcs, "0.1.1", "199c7fd4af3351758378355909145a2d187c565555ed16bde30b5055114652ed", [:mix], [], "hexpm", "7bf2553c32bc7948959e599de0b39745ef988b0914fdb2cf89ea2bed569c1357"}, + "phoenix_client": {:hex, :phoenix_client, "0.10.0", "a77ace5495c400001808e96980673dd3b97b1048f296fd032991c52e8f5fe93d", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:websocket_client, "~> 1.3", [hex: :websocket_client, repo: "hexpm", optional: true]}], "hexpm", "9374a29a9f835125cec73a2b45086eedce8df6b4d7c5353fced11bb48a3d6800"}, + "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"}, + "plug": {:hex, :plug, "1.12.1", "645678c800601d8d9f27ad1aebba1fdb9ce5b2623ddb961a074da0b96c35187d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d57e799a777bc20494b784966dc5fbda91eb4a09f571f76545b72a634ce0d30b"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.5.2", "62894ccd601cf9597e2c23911ff12798a8a18d237e9739f58a6b04e4988899fe", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "ea6e87f774c8608d60c8d34022a7d073bd7680a0a013f049fc62bf35efea1044"}, + "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, + "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, + "rabbit_common": {:hex, :rabbit_common, "3.8.9", "5a80cb825013ada01921db6f20143295eff8c43284b96a4a40e52576397c9322", [:make, :rebar3], [{:credentials_obfuscation, "2.2.0", [hex: :credentials_obfuscation, repo: "hexpm", optional: false]}, {:jsx, "2.11.0", [hex: :jsx, repo: "hexpm", optional: false]}, {:lager, "3.8.0", [hex: :lager, repo: "hexpm", optional: false]}, {:ranch, "1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}, {:recon, "2.5.1", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm", "e8138d2cf3fcef8e1c37f5e2c0fd39ca052b1fe98d21036508ed58f7edece33d"}, + "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, + "recon": {:hex, :recon, "2.5.1", "430ffa60685ac1efdfb1fe4c97b8767c92d0d92e6e7c3e8621559ba77598678a", [:mix, :rebar3], [], "hexpm", "5721c6b6d50122d8f68cccac712caa1231f97894bab779eff5ff0f886cb44648"}, + "ring_logger": {:hex, :ring_logger, "0.8.2", "78e0ffbf89b3f5b3c58f8660cb6b6fe2ca7ed5f56dc64e993119189d629c278c", [:mix], [{:circular_buffer, "~> 0.4.0", [hex: :circular_buffer, repo: "hexpm", optional: false]}], "hexpm", "864c8982bfcdc17b7501d00cc2bcede6727ebf95cbeba30e70c795d03f9138c1"}, + "rollbax": {:hex, :rollbax, "0.11.0", "9557935d09d154c8775fa4efc709bfacbb73f20c58a3ced31dea2a74dd6e25de", [:mix], [{:hackney, "~> 1.1", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "a74318b175aae4bdddcc1ecfdf38755df3d8143c9902b1bfd19507ac9901062d"}, + "sbroker": {:hex, :sbroker, "1.0.0", "28ff1b5e58887c5098539f236307b36fe1d3edaa2acff9d6a3d17c2dcafebbd0", [:rebar3], [], "hexpm", "ba952bfa35b374e1e5d84bc5f5efe8360c6f99dc93b3118f714a9a2dff6c9e19"}, + "shoehorn": {:hex, :shoehorn, "0.7.0", "fc23870fb6b470f5c520fee692637b120a36e163842ab497bbec7e8a1aa6cfe3", [:mix], [], "hexpm", "eeb317ac677b228906039ccf532a582ad9f6d31d7958c98f5c853fe0459e0243"}, + "socket": {:hex, :socket, "0.3.13", "98a2ab20ce17f95fb512c5cadddba32b57273e0d2dba2d2e5f976c5969d0c632", [:mix], [], "hexpm", "f82ea9833ef49dde272e6568ab8aac657a636acb4cf44a7de8a935acb8957c2e"}, + "sqlite_ecto2": {:hex, :sqlite_ecto2, "2.3.1", "fe58926854c3962c4c8710bd1070dd4ba3717ba77250387794cb7a65f77006aa", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:ecto, "2.2.9", [hex: :ecto, repo: "hexpm", optional: false]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: false]}, {:sqlitex, "~> 1.4", [hex: :sqlitex, repo: "hexpm", optional: false]}], "hexpm", "a588e8e4ab9570c32a03605fabff86f0fee1040530d33edc4fc4392db4d81700"}, + "sqlitex": {:hex, :sqlitex, "1.4.3", "a50f12d6aeb25f4ebb128453386c09bbba8f5abd3c7713dc5eaa92f359926ac5", [:mix], [{:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:esqlite, "~> 0.2.4", [hex: :esqlite, repo: "hexpm", optional: false]}], "hexpm", "0e1974b48684ba85255d2fe16c6106d52f5e759b260c95f676b23aa13b708a96"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, + "system_registry": {:hex, :system_registry, "0.8.2", "df791dc276652fcfb53be4dab823e05f8269b96ac57c26f86a67838dbc0eefe7", [:mix], [], "hexpm", "f7acdede22c73ab0b3735eead7f2095efb2a7a6198366564205274db2ca2a8f8"}, + "table_rex": {:hex, :table_rex, "2.0.0", "712783cbc2decb4d644d2ab8ad9315294f960c41b2cf0539308164922e352084", [:mix], [], "hexpm", "b183ff68abe9ace8764af4c2828767865d2c854d1d6f8cfd3660218166ed89a1"}, + "telemetry": {:hex, :telemetry, "1.0.0", "0f453a102cdf13d506b7c0ab158324c337c41f1cc7548f0bc0e130bbf0ae9452", [:rebar3], [], "hexpm", "73bc09fa59b4a0284efb4624335583c528e07ec9ae76aca96ea0673850aec57a"}, + "tesla": {:hex, :tesla, "1.4.3", "f5a494e08fb1abe4fd9c28abb17f3d9b62b8f6fc492860baa91efb1aab61c8a0", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "e0755bb664bf4d664af72931f320c97adbf89da4586670f4864bf259b5750386"}, + "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, + "toolshed": {:hex, :toolshed, "0.2.24", "9df521cd565fd921dbfcd9668f4a1378efeb33a834743a287f4a7f9c9f01baa0", [:mix], [{:nerves_runtime, "~> 0.8", [hex: :nerves_runtime, repo: "hexpm", optional: true]}], "hexpm", "c80de2c3a2ddeada0f709938607a1d3a136242168ea6638a12cf09445c8cf2f6"}, + "tortoise": {:hex, :tortoise, "0.10.0", "d8821b9a5052355ca61d9fa784652f435997fa98b210f88565c98f3494605efd", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "926d97b03cd0d2f6e0e1ebf06c1efa50101de96d0317dea5604c1c9e43e66735"}, + "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, + "uboot_env": {:hex, :uboot_env, "0.3.0", "8afbcc8e5b65e5d0d5660ded2f5835a959d2326fa8683183f380cd6464e75174", [:mix], [], "hexpm", "d8fe5d2b4d52a14398ace02bd604ff7a0fa8960550bb7254f75dcbd438ddc6a1"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, + "uuid": {:hex, :uuid, "1.1.8", "e22fc04499de0de3ed1116b770c7737779f226ceefa0badb3592e64d5cfb4eb9", [:mix], [], "hexpm", "c790593b4c3b601f5dc2378baae7efaf5b3d73c4c6456ba85759905be792f2ac"}, + "vintage_net": {:hex, :vintage_net, "0.11.1", "3bf5696c863c83dea7b6c245ca5b4cf4408961d06f6cbdeff271128c985db9f1", [:make, :mix], [{:beam_notify, "~> 0.2.0", [hex: :beam_notify, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:gen_state_machine, "~> 2.0.0 or ~> 2.1.0 or ~> 3.0.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}, {:muontrap, "~> 0.5.1 or ~> 0.6.0", [hex: :muontrap, repo: "hexpm", optional: false]}], "hexpm", "4d56f40a821098a4e734cf8e3de57ef7b4a04723ff105e3561a48baa9b2f138e"}, + "vintage_net_direct": {:hex, :vintage_net_direct, "0.9.0", "fbb61973dd0ea39029557a89be9dffca7801a0817dc4a181d129325a0fe6be93", [:mix], [{:one_dhcpd, "~> 0.2.3", [hex: :one_dhcpd, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.9.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "d00537f179f177b46ccde29f7461566c49c094fa02c19691b866afa643052b92"}, + "vintage_net_ethernet": {:hex, :vintage_net_ethernet, "0.10.3", "5325c590459544f871b0a807061fa37c3833ed8f83b94b0a15d497177503d5c2", [:mix], [{:vintage_net, "~> 0.10.0 or ~> 0.11.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "4ec1ae7b2188829e493f54e0ba9e36ea53e8c95aecdf5950011ce4f13fe4ed52"}, + "vintage_net_wifi": {:hex, :vintage_net_wifi, "0.10.6", "f5509f7c455ee5f4bc52174ada4d8eaf6e6e597f9d5ba51f17ffed613c0e0a8a", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:vintage_net, "~> 0.10.0 or ~> 0.11.0", [hex: :vintage_net, repo: "hexpm", optional: false]}], "hexpm", "2d94acb727ba5982e1c17b50cb08594d644f8da7bd8f9a56c68d2de972319080"}, + "websocket_client": {:hex, :websocket_client, "1.3.0", "2275d7daaa1cdacebf2068891c9844b15f4fdc3de3ec2602420c2fb486db59b6", [:rebar3], [], "hexpm", "b864fa076f059b615da4ab99240e515b26132ce4d2d0f9df5d7f22f01fa04b65"}, + "x509": {:hex, :x509, "0.8.0", "b286b9dbb32801f76f48bdea476304d280c64ce172ea330c23d8df7ea9e75ce6", [:mix], [], "hexpm", "8aafaafdcafb1ea9f06bfc32c3b03ccc66f087e0faf36ef94c0195bb7a04157e"}, } diff --git a/farmbot_os/platform/host/configurator.ex b/platform/host/configurator.ex similarity index 81% rename from farmbot_os/platform/host/configurator.ex rename to platform/host/configurator.ex index 94dad3455..714f2e6ad 100644 --- a/farmbot_os/platform/host/configurator.ex +++ b/platform/host/configurator.ex @@ -20,9 +20,6 @@ defmodule FarmbotOS.Platform.Host.Configurator do def init(_) do start_node() - # Get out authorization data out of the environment. - # for host environment this will be configured at compile time. - # for target environment it will be configured by `configurator`. System.get_env("FARMBOT_EMAIL") || raise error("email") System.get_env("FARMBOT_PASSWORD") || raise error("password") System.get_env("FARMBOT_SERVER") || raise error("server") diff --git a/farmbot_os/platform/host/system_tasks.ex b/platform/host/system_tasks.ex similarity index 62% rename from farmbot_os/platform/host/system_tasks.ex rename to platform/host/system_tasks.ex index 739b15965..7580f84f3 100644 --- a/farmbot_os/platform/host/system_tasks.ex +++ b/platform/host/system_tasks.ex @@ -5,11 +5,6 @@ defmodule FarmbotOS.Platform.Host.SystemTasks do def reboot() do Application.stop(:farmbot) - Application.stop(:farmbot_ext) - Application.stop(:farmbot_core) - - Application.ensure_all_started(:farmbot_core) - Application.ensure_all_started(:farmbot_ext) Application.ensure_all_started(:farmbot) end diff --git a/farmbot_os/platform/target/configurator/captive_portal.ex b/platform/target/configurator/captive_portal.ex similarity index 100% rename from farmbot_os/platform/target/configurator/captive_portal.ex rename to platform/target/configurator/captive_portal.ex diff --git a/farmbot_os/platform/target/configurator/validator.ex b/platform/target/configurator/validator.ex similarity index 100% rename from farmbot_os/platform/target/configurator/validator.ex rename to platform/target/configurator/validator.ex diff --git a/farmbot_os/platform/target/configurator/vintage_network_layer.ex b/platform/target/configurator/vintage_network_layer.ex similarity index 100% rename from farmbot_os/platform/target/configurator/vintage_network_layer.ex rename to platform/target/configurator/vintage_network_layer.ex diff --git a/farmbot_os/platform/target/gpio/circuits_gpio_handler.ex b/platform/target/gpio/circuits_gpio_handler.ex similarity index 100% rename from farmbot_os/platform/target/gpio/circuits_gpio_handler.ex rename to platform/target/gpio/circuits_gpio_handler.ex diff --git a/farmbot_os/platform/target/gpio/circuits_leds_handler.ex b/platform/target/gpio/circuits_leds_handler.ex similarity index 100% rename from farmbot_os/platform/target/gpio/circuits_leds_handler.ex rename to platform/target/gpio/circuits_leds_handler.ex diff --git a/farmbot_os/platform/target/info_workers/disk_usage.ex b/platform/target/info_workers/disk_usage.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/disk_usage.ex rename to platform/target/info_workers/disk_usage.ex diff --git a/farmbot_os/platform/target/info_workers/memory_usage.ex b/platform/target/info_workers/memory_usage.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/memory_usage.ex rename to platform/target/info_workers/memory_usage.ex diff --git a/farmbot_os/platform/target/info_workers/soc_temp.ex b/platform/target/info_workers/soc_temp.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/soc_temp.ex rename to platform/target/info_workers/soc_temp.ex diff --git a/farmbot_os/platform/target/info_workers/supervisor.ex b/platform/target/info_workers/supervisor.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/supervisor.ex rename to platform/target/info_workers/supervisor.ex diff --git a/farmbot_os/platform/target/info_workers/throttle.ex b/platform/target/info_workers/throttle.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/throttle.ex rename to platform/target/info_workers/throttle.ex diff --git a/farmbot_os/platform/target/info_workers/uptime.ex b/platform/target/info_workers/uptime.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/uptime.ex rename to platform/target/info_workers/uptime.ex diff --git a/farmbot_os/platform/target/info_workers/wifi_level.ex b/platform/target/info_workers/wifi_level.ex similarity index 100% rename from farmbot_os/platform/target/info_workers/wifi_level.ex rename to platform/target/info_workers/wifi_level.ex diff --git a/farmbot_os/platform/target/network.ex b/platform/target/network.ex similarity index 100% rename from farmbot_os/platform/target/network.ex rename to platform/target/network.ex diff --git a/farmbot_os/platform/target/network/presetup.ex b/platform/target/network/presetup.ex similarity index 100% rename from farmbot_os/platform/target/network/presetup.ex rename to platform/target/network/presetup.ex diff --git a/farmbot_os/platform/target/network/supervisor.ex b/platform/target/network/supervisor.ex similarity index 100% rename from farmbot_os/platform/target/network/supervisor.ex rename to platform/target/network/supervisor.ex diff --git a/farmbot_os/platform/target/network/utils.ex b/platform/target/network/utils.ex similarity index 99% rename from farmbot_os/platform/target/network/utils.ex rename to platform/target/network/utils.ex index 2ba558d20..2d8ab52cc 100644 --- a/farmbot_os/platform/target/network/utils.ex +++ b/platform/target/network/utils.ex @@ -1,6 +1,5 @@ defmodule FarmbotOS.Platform.Target.Network.Utils do @moduledoc "common network related utilities" - import FarmbotCore.Config, only: [get_config_value: 3] def build_hostap_ssid do diff --git a/farmbot_os/platform/target/rtc_worker.ex b/platform/target/rtc_worker.ex similarity index 94% rename from farmbot_os/platform/target/rtc_worker.ex rename to platform/target/rtc_worker.ex index f0d46471e..69b88ad62 100644 --- a/farmbot_os/platform/target/rtc_worker.ex +++ b/platform/target/rtc_worker.ex @@ -7,6 +7,11 @@ defmodule FarmbotOS.Platform.Target.RTCWorker do require Logger alias Circuits.I2C @eleven_minutes 660_000 + if Code.ensure_compiled(NervesTime) do + @nerves_time NervesTime + else + @nerves_time nil + end @doc "checks if an RTC is available on the I2C bus" @spec rtc_available?(I2C.bus()) :: boolean() @@ -195,11 +200,13 @@ defmodule FarmbotOS.Platform.Target.RTCWorker do def handle_info(:set_rtc_from_ntp, %{i2c: i2c} = state) do dt = NaiveDateTime.utc_now() - if NervesTime.synchronized?() do - set_time_to_rtc(i2c, dt) - Process.send_after(self(), :set_rtc_from_ntp, @eleven_minutes) - else - send(self(), :set_system_time_from_rtc) + if @nerves_time do + if @nerves_time.synchronized?() do + set_time_to_rtc(i2c, dt) + Process.send_after(self(), :set_rtc_from_ntp, @eleven_minutes) + else + send(self(), :set_system_time_from_rtc) + end end {:noreply, state} diff --git a/farmbot_os/platform/target/shoehorn_handler.ex b/platform/target/shoehorn_handler.ex similarity index 66% rename from farmbot_os/platform/target/shoehorn_handler.ex rename to platform/target/shoehorn_handler.ex index cb47f4606..9d8d9e272 100644 --- a/farmbot_os/platform/target/shoehorn_handler.ex +++ b/platform/target/shoehorn_handler.ex @@ -25,41 +25,29 @@ defmodule FarmbotOS.Platform.Target.ShoehornHandler do end def application_exited(app, reason, %{restart_counts: count} = state) - when count >= 5 and - app in [ - :farmbot_core, - :farmbot_ext, - :farmbot - ] do + when count >= 5 do error_log( "Farmbot app: #{app} exited #{count}: #{inspect(reason, limit: :infinity)}" ) # Force a factory reset. - FarmbotOS.System.factory_reset( - "Farmbot app: #{app} exited #{count}: #{inspect(reason, limit: :infinity)}" - ) + # FarmbotOS.System.factory_reset( + # "Farmbot app: #{app} exited #{count}: #{inspect(reason, limit: :infinity)}" + # ) - FarmbotTelemetry.event(:shoehorn, :application_exit, nil, application: app) + # FarmbotTelemetry.event(:shoehorn, :application_exit, nil, application: app) {:continue, %{state | restart_counts: count + 1}} end - def application_exited(app, reason, %{restart_counts: count} = state) - when app in [ - :farmbot_core, - :farmbot_ext, - :farmbot - ] do + def application_exited(app, reason, %{restart_counts: count} = state) do error_log( "Farmbot app: #{app} exited #{count}: #{inspect(reason, limit: :infinity)}" ) - FarmbotTelemetry.event(:shoehorn, :application_exit, nil, application: app) + # FarmbotTelemetry.event(:shoehorn, :application_exit, nil, application: app) - with {:ok, _} <- Application.ensure_all_started(:farmbot_core), - {:ok, _} <- Application.ensure_all_started(:farmbot_ext), - {:ok, _} <- Application.ensure_all_started(:farmbot) do + with {:ok, _} <- Application.ensure_all_started(:farmbot) do success_log("Recovered from application exit") end @@ -71,7 +59,7 @@ defmodule FarmbotOS.Platform.Target.ShoehornHandler do "Application stopped: #{inspect(app)} #{inspect(reason, limit: :infinity)}" ) - FarmbotTelemetry.event(:shoehorn, :application_exit, nil, application: app) + # FarmbotTelemetry.event(:shoehorn, :application_exit, nil, application: app) # Application.ensure_all_started(app) {:continue, state} end diff --git a/farmbot_os/platform/target/ssh_console.ex b/platform/target/ssh_console.ex similarity index 100% rename from farmbot_os/platform/target/ssh_console.ex rename to platform/target/ssh_console.ex diff --git a/farmbot_os/platform/target/system_tasks.ex b/platform/target/system_tasks.ex similarity index 100% rename from farmbot_os/platform/target/system_tasks.ex rename to platform/target/system_tasks.ex diff --git a/farmbot_core/priv/arduino_firmware.hex b/priv/arduino_firmware.hex similarity index 100% rename from farmbot_core/priv/arduino_firmware.hex rename to priv/arduino_firmware.hex diff --git a/farmbot_core/priv/eeprom_clear.ino.hex b/priv/eeprom_clear.ino.hex similarity index 100% rename from farmbot_core/priv/eeprom_clear.ino.hex rename to priv/eeprom_clear.ino.hex diff --git a/farmbot_core/priv/express_k10.hex b/priv/express_k10.hex similarity index 100% rename from farmbot_core/priv/express_k10.hex rename to priv/express_k10.hex diff --git a/farmbot_core/priv/farmduino.hex b/priv/farmduino.hex similarity index 100% rename from farmbot_core/priv/farmduino.hex rename to priv/farmduino.hex diff --git a/farmbot_core/priv/farmduino_k14.hex b/priv/farmduino_k14.hex similarity index 100% rename from farmbot_core/priv/farmduino_k14.hex rename to priv/farmduino_k14.hex diff --git a/farmbot_core/priv/farmduino_k15.hex b/priv/farmduino_k15.hex similarity index 100% rename from farmbot_core/priv/farmduino_k15.hex rename to priv/farmduino_k15.hex diff --git a/farmbot_core/priv/farmduino_k16.hex b/priv/farmduino_k16.hex similarity index 100% rename from farmbot_core/priv/farmduino_k16.hex rename to priv/farmduino_k16.hex diff --git a/farmbot_os/priv/prod.pub b/priv/prod.pub similarity index 100% rename from farmbot_os/priv/prod.pub rename to priv/prod.pub diff --git a/priv/repo/migrations/20211012213544_initial_migration.exs b/priv/repo/migrations/20211012213544_initial_migration.exs new file mode 100644 index 000000000..28bc22321 --- /dev/null +++ b/priv/repo/migrations/20211012213544_initial_migration.exs @@ -0,0 +1,229 @@ +defmodule FarmbotCore.Asset.Repo.Migrations.InitialMigration do + use Ecto.Migration + + def up do + execute( + "CREATE TABLE IF NOT EXISTS \"bool_values\" (\"id\" INTEGER PRIMARY KEY, \"value\" BOOLEAN);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"configs\" (\"id\" INTEGER PRIMARY KEY, \"group_id\" INTEGER NOT NULL CONSTRAINT \"configs_group_id_fkey\" REFERENCES \"groups\"(\"id\"), \"string_value_id\" INTEGER CONSTRAINT \"configs_string_value_id_fkey\" REFERENCES \"string_values\"(\"id\"), \"bool_value_id\" INTEGER CONSTRAINT \"configs_bool_value_id_fkey\" REFERENCES \"bool_values\"(\"id\"), \"float_value_id\" INTEGER CONSTRAINT \"configs_float_value_id_fkey\" REFERENCES \"float_values\"(\"id\"), \"key\" TEXT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"device_certs\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"serial_number\" TEXT, \"tags\" JSON, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"devices\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"name\" TEXT, \"timezone\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"last_ota\" UTC_DATETIME, \"last_ota_checkup\" UTC_DATETIME, \"ota_hour\" INTEGER, \"mounted_tool_id\" INTEGER, \"needs_reset\" BOOLEAN DEFAULT 0, \"lat\" FLOAT, \"lng\" FLOAT, \"indoor\" BOOLEAN);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"farm_event_executions\" (\"local_id\" BINARY_ID PRIMARY KEY, \"farm_event_local_id\" BINARY_ID CONSTRAINT \"farm_event_executions_farm_event_local_id_fkey\" REFERENCES \"farm_events\"(\"local_id\"), \"scheduled_at\" UTC_DATETIME, \"executed_at\" UTC_DATETIME, \"status\" TEXT, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"farm_events\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"end_time\" UTC_DATETIME, \"executable_type\" TEXT, \"executable_id\" ID, \"repeat\" INTEGER, \"start_time\" UTC_DATETIME, \"time_unit\" TEXT, \"last_executed\" UTC_DATETIME, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"body\" JSON);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"farmware_envs\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"key\" TEXT, \"value\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"farmware_installations\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"url\" TEXT, \"manifest\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"farmware_repositories\" (\"id\" INTEGER PRIMARY KEY, \"manifests\" TEXT, \"url\" TEXT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"fbos_configs\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"arduino_debug_messages\" BOOLEAN, \"auto_sync\" BOOLEAN, \"beta_opt_in\" BOOLEAN, \"disable_factory_reset\" BOOLEAN, \"firmware_hardware\" TEXT, \"firmware_path\" TEXT, \"firmware_input_log\" BOOLEAN, \"firmware_output_log\" BOOLEAN, \"firmware_debug_log\" BOOLEAN, \"network_not_found_timer\" INTEGER, \"os_auto_update\" BOOLEAN, \"sequence_body_log\" BOOLEAN, \"sequence_complete_log\" BOOLEAN, \"sequence_init_log\" BOOLEAN, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"update_channel\" TEXT, \"safe_height\" FLOAT, \"soil_height\" FLOAT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"firmware_configs\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"pin_guard_4_time_out\" FLOAT, \"pin_guard_1_active_state\" FLOAT, \"encoder_scaling_y\" FLOAT, \"movement_invert_2_endpoints_x\" FLOAT, \"movement_min_spd_y\" FLOAT, \"pin_guard_2_time_out\" FLOAT, \"movement_timeout_y\" FLOAT, \"movement_home_at_boot_y\" FLOAT, \"movement_home_spd_z\" FLOAT, \"movement_invert_endpoints_z\" FLOAT, \"pin_guard_1_pin_nr\" FLOAT, \"movement_invert_endpoints_y\" FLOAT, \"movement_max_spd_y\" FLOAT, \"movement_home_up_y\" FLOAT, \"encoder_missed_steps_decay_z\" FLOAT, \"movement_home_spd_y\" FLOAT, \"encoder_use_for_pos_x\" FLOAT, \"movement_step_per_mm_x\" FLOAT, \"movement_home_at_boot_z\" FLOAT, \"movement_steps_acc_dec_z\" FLOAT, \"pin_guard_5_pin_nr\" FLOAT, \"movement_invert_motor_z\" FLOAT, \"movement_max_spd_x\" FLOAT, \"movement_enable_endpoints_y\" FLOAT, \"movement_enable_endpoints_z\" FLOAT, \"movement_stop_at_home_x\" FLOAT, \"movement_axis_nr_steps_y\" FLOAT, \"pin_guard_1_time_out\" FLOAT, \"movement_home_at_boot_x\" FLOAT, \"pin_guard_2_pin_nr\" FLOAT, \"encoder_scaling_z\" FLOAT, \"param_e_stop_on_mov_err\" FLOAT, \"encoder_enabled_x\" FLOAT, \"pin_guard_2_active_state\" FLOAT, \"encoder_missed_steps_decay_y\" FLOAT, \"movement_home_up_z\" FLOAT, \"movement_enable_endpoints_x\" FLOAT, \"movement_step_per_mm_y\" FLOAT, \"pin_guard_3_pin_nr\" FLOAT, \"param_mov_nr_retry\" FLOAT, \"movement_stop_at_home_z\" FLOAT, \"pin_guard_4_active_state\" FLOAT, \"movement_steps_acc_dec_y\" FLOAT, \"movement_home_spd_x\" FLOAT, \"movement_keep_active_x\" FLOAT, \"pin_guard_3_time_out\" FLOAT, \"movement_keep_active_y\" FLOAT, \"encoder_scaling_x\" FLOAT, \"movement_invert_2_endpoints_z\" FLOAT, \"encoder_missed_steps_decay_x\" FLOAT, \"movement_timeout_z\" FLOAT, \"encoder_missed_steps_max_z\" FLOAT, \"movement_min_spd_z\" FLOAT, \"encoder_enabled_y\" FLOAT, \"encoder_type_y\" FLOAT, \"movement_home_up_x\" FLOAT, \"pin_guard_3_active_state\" FLOAT, \"movement_invert_motor_x\" FLOAT, \"movement_keep_active_z\" FLOAT, \"movement_max_spd_z\" FLOAT, \"movement_secondary_motor_invert_x\" FLOAT, \"movement_stop_at_max_x\" FLOAT, \"movement_steps_acc_dec_x\" FLOAT, \"pin_guard_4_pin_nr\" FLOAT, \"encoder_type_x\" FLOAT, \"movement_invert_2_endpoints_y\" FLOAT, \"encoder_invert_y\" FLOAT, \"movement_axis_nr_steps_x\" FLOAT, \"movement_stop_at_max_z\" FLOAT, \"movement_invert_endpoints_x\" FLOAT, \"encoder_invert_z\" FLOAT, \"encoder_use_for_pos_z\" FLOAT, \"pin_guard_5_active_state\" FLOAT, \"movement_step_per_mm_z\" FLOAT, \"encoder_enabled_z\" FLOAT, \"movement_secondary_motor_x\" FLOAT, \"pin_guard_5_time_out\" FLOAT, \"movement_min_spd_x\" FLOAT, \"encoder_type_z\" FLOAT, \"movement_stop_at_max_y\" FLOAT, \"encoder_use_for_pos_y\" FLOAT, \"encoder_missed_steps_max_y\" FLOAT, \"movement_timeout_x\" FLOAT, \"movement_stop_at_home_y\" FLOAT, \"movement_axis_nr_steps_z\" FLOAT, \"encoder_invert_x\" FLOAT, \"encoder_missed_steps_max_x\" FLOAT, \"movement_invert_motor_y\" FLOAT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"api_migrated\" BOOLEAN, \"movement_motor_current_x\" FLOAT, \"movement_motor_current_y\" FLOAT, \"movement_motor_current_z\" FLOAT, \"movement_stall_sensitivity_x\" FLOAT, \"movement_stall_sensitivity_y\" FLOAT, \"movement_stall_sensitivity_z\" FLOAT, \"movement_microsteps_x\" FLOAT, \"movement_microsteps_y\" FLOAT, \"movement_microsteps_z\" FLOAT, \"movement_max_spd_z2\" FLOAT, \"movement_min_spd_z2\" FLOAT, \"movement_steps_acc_dec_z2\" FLOAT, \"movement_calibration_retry_x\" FLOAT, \"movement_calibration_retry_y\" FLOAT, \"movement_calibration_retry_z\" FLOAT, \"movement_calibration_deadzone_x\" FLOAT, \"movement_calibration_deadzone_y\" FLOAT, \"movement_calibration_deadzone_z\" FLOAT, \"movement_axis_stealth_x\" FLOAT, \"movement_axis_stealth_y\" FLOAT, \"movement_axis_stealth_z\" FLOAT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"first_party_farmwares\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"url\" TEXT, \"manifest\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"float_values\" (\"id\" INTEGER PRIMARY KEY, \"value\" FLOAT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"gpio_registry\" (\"id\" INTEGER PRIMARY KEY, \"pin\" INTEGER, \"sequence_id\" INTEGER);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"groups\" (\"id\" INTEGER PRIMARY KEY, \"group_name\" TEXT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"local_metas\" (\"id\" INTEGER PRIMARY KEY, \"status\" TEXT, \"table\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"asset_local_id\" BINARY_ID);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"logs\" (\"id\" BINARY_ID PRIMARY KEY, \"message\" TEXT, \"level\" TEXT, \"verbosity\" INTEGER, \"meta\" TEXT, \"function\" TEXT, \"file\" TEXT, \"line\" INTEGER, \"module\" TEXT, \"version\" TEXT, \"commit\" TEXT, \"target\" TEXT, \"env\" TEXT, \"inserted_at\" NAIVE_DATETIME NOT NULL, \"updated_at\" NAIVE_DATETIME NOT NULL, \"hash\" BINARY, \"duplicates\" INTEGER);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"network_interfaces\" (\"id\" INTEGER PRIMARY KEY, \"name\" TEXT NOT NULL, \"type\" TEXT NOT NULL, \"ssid\" TEXT, \"psk\" TEXT, \"security\" TEXT, \"ipv4_method\" TEXT, \"migrated\" BOOLEAN, \"maybe_hidden\" BOOLEAN, \"ipv4_address\" TEXT, \"ipv4_gateway\" TEXT, \"ipv4_subnet_mask\" TEXT, \"domain\" TEXT, \"name_servers\" TEXT, \"regulatory_domain\" TEXT DEFAULT 'US', \"identity\" TEXT, \"password\" TEXT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"peripherals\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"pin\" INTEGER, \"mode\" INTEGER, \"label\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"persistent_regimens\" (\"id\" INTEGER PRIMARY KEY, \"regimen_id\" INTEGER, \"time\" UTC_DATETIME, \"farm_event_id\" INTEGER);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"pin_bindings\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"pin_num\" INTEGER, \"sequence_id\" INTEGER, \"special_action\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"point_groups\" (\"local_id\" BINARY_ID PRIMARY KEY, \"monitor\" BOOLEAN DEFAULT 1, \"id\" ID, \"name\" TEXT, \"point_ids\" JSON, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"sort_type\" TEXT, \"criteria\" TEXT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"points\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"meta\" TEXT, \"name\" TEXT, \"plant_stage\" TEXT, \"planted_at\" UTC_DATETIME, \"pointer_type\" TEXT, \"radius\" FLOAT, \"x\" FLOAT, \"y\" FLOAT, \"z\" FLOAT, \"tool_id\" INTEGER, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"discarded_at\" UTC_DATETIME, \"gantry_mounted\" BOOLEAN DEFAULT 0, \"openfarm_slug\" TEXT, \"pullout_direction\" INTEGER DEFAULT 0);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"public_keys\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"name\" TEXT, \"public_key\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"regimen_instance_executions\" (\"local_id\" BINARY_ID PRIMARY KEY, \"regimen_instance_local_id\" BINARY_ID CONSTRAINT \"regimen_instance_executions_regimen_instance_local_id_fkey\" REFERENCES \"regimen_instances\"(\"local_id\"), \"scheduled_at\" UTC_DATETIME, \"executed_at\" UTC_DATETIME, \"status\" TEXT, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"regimen_instances\" (\"local_id\" BINARY_ID PRIMARY KEY, \"started_at\" UTC_DATETIME, \"epoch\" UTC_DATETIME, \"next\" UTC_DATETIME, \"next_sequence_id\" ID, \"regimen_id\" BINARY_ID CONSTRAINT \"persistent_regimens_regimen_id_fkey\" REFERENCES \"regimens\"(\"local_id\"), \"farm_event_id\" BINARY_ID CONSTRAINT \"persistent_regimens_farm_event_id_fkey\" REFERENCES \"farm_events\"(\"local_id\"), \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"regimens\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"regimen_items\" JSON, \"name\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"body\" JSON);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"sensor_readings\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"mode\" INTEGER, \"pin\" INTEGER, \"value\" INTEGER, \"x\" FLOAT, \"y\" FLOAT, \"z\" FLOAT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"sensors\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"pin\" INTEGER, \"mode\" INTEGER, \"label\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"sequences\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"name\" TEXT, \"kind\" TEXT, \"args\" TEXT, \"body\" JSON, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"string_values\" (\"id\" INTEGER PRIMARY KEY, \"value\" TEXT);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"sync_cmds\" (\"id\" INTEGER PRIMARY KEY, \"remote_id\" INTEGER, \"kind\" TEXT, \"body\" TEXT, \"inserted_at\" NAIVE_DATETIME NOT NULL, \"updated_at\" NAIVE_DATETIME NOT NULL);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"syncs\" (\"local_id\" BINARY_ID PRIMARY KEY, \"devices\" JSON, \"farm_events\" JSON, \"farmware_envs\" JSON, \"farmware_installations\" JSON, \"fbos_configs\" JSON, \"firmware_configs\" JSON, \"peripherals\" JSON, \"pin_bindings\" JSON, \"points\" JSON, \"regimens\" JSON, \"sensor_readings\" JSON, \"sensors\" JSON, \"sequences\" JSON, \"tools\" JSON, \"now\" UTC_DATETIME, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL, \"public_keys\" JSON, \"first_party_farmwares\" JSON, \"point_groups\" JSON);" + ) + + execute( + "CREATE TABLE IF NOT EXISTS \"tools\" (\"local_id\" BINARY_ID PRIMARY KEY, \"id\" ID, \"name\" TEXT, \"monitor\" BOOLEAN DEFAULT 1, \"created_at\" UTC_DATETIME NOT NULL, \"updated_at\" UTC_DATETIME NOT NULL);" + ) + + execute("CREATE UNIQUE INDEX \"devices_id_index\" ON \"devices\" (\"id\");") + + execute( + "CREATE UNIQUE INDEX \"farm_events_id_index\" ON \"farm_events\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"farmware_envs_id_index\" ON \"farmware_envs\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"farmware_installations_id_index\" ON \"farmware_installations\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"farmware_repositories_url_index\" ON \"farmware_repositories\" (\"url\");" + ) + + execute( + "CREATE UNIQUE INDEX \"fbos_configs_id_index\" ON \"fbos_configs\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"firmware_configs_id_index\" ON \"firmware_configs\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"first_party_farmwares_id_index\" ON \"first_party_farmwares\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"local_metas_table_asset_local_id_index\" ON \"local_metas\" (\"table\", \"asset_local_id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"network_interfaces_name_index\" ON \"network_interfaces\" (\"name\");" + ) + + execute( + "CREATE UNIQUE INDEX \"peripherals_id_index\" ON \"peripherals\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"persistent_regimens_epoch_index\" ON \"regimen_instances\" (\"epoch\");" + ) + + execute( + "CREATE UNIQUE INDEX \"persistent_regimens_local_id_regimen_id_farm_event_id_index\" ON \"regimen_instances\" (\"local_id\", \"regimen_id\", \"farm_event_id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"persistent_regimens_started_at_index\" ON \"regimen_instances\" (\"started_at\");" + ) + + execute( + "CREATE UNIQUE INDEX \"pin_bindings_id_index\" ON \"pin_bindings\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"point_groups_id_index\" ON \"point_groups\" (\"id\");" + ) + + execute("CREATE UNIQUE INDEX \"points_id_index\" ON \"points\" (\"id\");") + + execute( + "CREATE UNIQUE INDEX \"public_keys_id_index\" ON \"public_keys\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"regimen_start_time\" ON \"persistent_regimens\" (\"regimen_id\", \"time\", \"farm_event_id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"regimens_id_index\" ON \"regimens\" (\"id\");" + ) + + execute( + "CREATE UNIQUE INDEX \"sensor_readings_id_index\" ON \"sensor_readings\" (\"id\");" + ) + + execute("CREATE UNIQUE INDEX \"sensors_id_index\" ON \"sensors\" (\"id\");") + + execute( + "CREATE UNIQUE INDEX \"sequences_id_index\" ON \"sequences\" (\"id\");" + ) + + execute("CREATE UNIQUE INDEX \"tools_id_index\" ON \"tools\" (\"id\");") + end +end diff --git a/priv/repo/migrations/20211013213544_seed_config_groups.exs b/priv/repo/migrations/20211013213544_seed_config_groups.exs new file mode 100644 index 000000000..52a574453 --- /dev/null +++ b/priv/repo/migrations/20211013213544_seed_config_groups.exs @@ -0,0 +1,25 @@ +defmodule FarmbotCore.Config.Repo.Migrations.SeedGroups do + use Ecto.Migration + + def change do + execute( + "INSERT INTO groups (group_name, id) VALUES ('authorization', 1), ('hardware_params', 2), ('settings', 3);" + ) + + execute( + "INSERT INTO bool_values (id, value) VALUES (16, 1), (17, 1), (18, 0);" + ) + + execute( + "INSERT INTO float_values (id, value) VALUES (1, NULL), (2, NULL), (3, NULL), (4, NULL), (5, NULL), (6, NULL), (7, NULL), (8, NULL), (9, NULL), (10, NULL), (11, NULL), (12, NULL), (13, NULL), (14, NULL), (15, NULL), (16, NULL), (17, NULL), (18, NULL), (19, NULL), (20, NULL), (21, NULL), (22, NULL), (23, NULL), (24, NULL), (25, NULL), (26, NULL), (27, NULL), (28, NULL), (29, NULL), (30, NULL), (31, NULL), (32, NULL), (33, NULL), (34, NULL), (35, NULL), (36, NULL), (37, NULL), (38, NULL), (39, NULL), (40, NULL), (41, NULL), (42, NULL), (43, NULL), (44, NULL), (45, NULL), (46, NULL), (47, NULL), (48, NULL), (49, NULL), (50, NULL), (51, NULL), (52, NULL), (53, NULL), (54, NULL), (55, NULL), (56, NULL), (57, NULL), (58, NULL), (59, NULL), (60, NULL), (61, NULL), (62, NULL), (63, NULL), (64, NULL), (65, NULL), (66, NULL), (67, NULL), (68, NULL), (69, NULL), (70, NULL), (71, NULL), (72, NULL), (73, NULL), (74, NULL), (75, NULL), (76, NULL), (77, NULL), (78, NULL), (79, NULL), (80, NULL), (81, NULL), (82, NULL), (83, NULL), (84, NULL), (85, NULL), (86, NULL), (87, NULL), (88, NULL), (89, NULL), (92, NULL), (93, NULL), (94, NULL);" + ) + + execute( + "INSERT INTO string_values (id, value) VALUES (1, 'https://my.farm.bot'), (2, NULL), (3, NULL), (4, NULL), (11, NULL), (12, '0.pool.ntp.org'), (13, '1.pool.ntp.org'), (14, 'my.farm.bot'), (15, NULL);" + ) + + execute( + "INSERT INTO configs (bool_value_id, float_value_id, group_id, id, key, string_value_id) VALUES (NULL, NULL, 1, 1, 'server', 1), (NULL, NULL, 1, 2, 'email', 2), (NULL, NULL, 1, 3, 'password', 3), (NULL, NULL, 1, 4, 'token', 4), (NULL, 1, 2, 5, 'param_version', NULL), (NULL, 2, 2, 6, 'param_test', NULL), (NULL, 3, 2, 7, 'param_config_ok', NULL), (NULL, 4, 2, 8, 'param_use_eeprom', NULL), (NULL, 5, 2, 9, 'param_e_stop_on_mov_err', NULL), (NULL, 6, 2, 10, 'param_mov_nr_retry', NULL), (NULL, 7, 2, 11, 'movement_timeout_x', NULL), (NULL, 8, 2, 12, 'movement_timeout_y', NULL), (NULL, 9, 2, 13, 'movement_timeout_z', NULL), (NULL, 10, 2, 14, 'movement_keep_active_x', NULL), (NULL, 11, 2, 15, 'movement_keep_active_y', NULL), (NULL, 12, 2, 16, 'movement_keep_active_z', NULL), (NULL, 13, 2, 17, 'movement_home_at_boot_x', NULL), (NULL, 14, 2, 18, 'movement_home_at_boot_y', NULL), (NULL, 15, 2, 19, 'movement_home_at_boot_z', NULL), (NULL, 16, 2, 20, 'movement_invert_endpoints_x', NULL), (NULL, 17, 2, 21, 'movement_invert_endpoints_y', NULL), (NULL, 18, 2, 22, 'movement_invert_endpoints_z', NULL), (NULL, 19, 2, 23, 'movement_enable_endpoints_x', NULL), (NULL, 20, 2, 24, 'movement_enable_endpoints_y', NULL), (NULL, 21, 2, 25, 'movement_enable_endpoints_z', NULL), (NULL, 22, 2, 26, 'movement_invert_motor_x', NULL), (NULL, 23, 2, 27, 'movement_invert_motor_y', NULL), (NULL, 24, 2, 28, 'movement_invert_motor_z', NULL), (NULL, 25, 2, 29, 'movement_secondary_motor_x', NULL), (NULL, 26, 2, 30, 'movement_secondary_motor_invert_x', NULL), (NULL, 27, 2, 31, 'movement_steps_acc_dec_x', NULL), (NULL, 28, 2, 32, 'movement_steps_acc_dec_y', NULL), (NULL, 29, 2, 33, 'movement_steps_acc_dec_z', NULL), (NULL, 30, 2, 34, 'movement_stop_at_home_x', NULL), (NULL, 31, 2, 35, 'movement_stop_at_home_y', NULL), (NULL, 32, 2, 36, 'movement_stop_at_home_z', NULL), (NULL, 33, 2, 37, 'movement_home_up_x', NULL), (NULL, 34, 2, 38, 'movement_home_up_y', NULL), (NULL, 35, 2, 39, 'movement_home_up_z', NULL), (NULL, 36, 2, 40, 'movement_step_per_mm_x', NULL), (NULL, 37, 2, 41, 'movement_step_per_mm_y', NULL), (NULL, 38, 2, 42, 'movement_step_per_mm_z', NULL), (NULL, 39, 2, 43, 'movement_min_spd_x', NULL), (NULL, 40, 2, 44, 'movement_min_spd_y', NULL), (NULL, 41, 2, 45, 'movement_min_spd_z', NULL), (NULL, 42, 2, 46, 'movement_home_spd_x', NULL), (NULL, 43, 2, 47, 'movement_home_spd_y', NULL), (NULL, 44, 2, 48, 'movement_home_spd_z', NULL), (NULL, 45, 2, 49, 'movement_max_spd_x', NULL), (NULL, 46, 2, 50, 'movement_max_spd_y', NULL), (NULL, 47, 2, 51, 'movement_max_spd_z', NULL), (NULL, 48, 2, 52, 'encoder_enabled_x', NULL), (NULL, 49, 2, 53, 'encoder_enabled_y', NULL), (NULL, 50, 2, 54, 'encoder_enabled_z', NULL), (NULL, 51, 2, 55, 'encoder_type_x', NULL), (NULL, 52, 2, 56, 'encoder_type_y', NULL), (NULL, 53, 2, 57, 'encoder_type_z', NULL), (NULL, 54, 2, 58, 'encoder_missed_steps_max_x', NULL), (NULL, 55, 2, 59, 'encoder_missed_steps_max_y', NULL), (NULL, 56, 2, 60, 'encoder_missed_steps_max_z', NULL), (NULL, 57, 2, 61, 'encoder_scaling_x', NULL), (NULL, 58, 2, 62, 'encoder_scaling_y', NULL), (NULL, 59, 2, 63, 'encoder_scaling_z', NULL), (NULL, 60, 2, 64, 'encoder_missed_steps_decay_x', NULL), (NULL, 61, 2, 65, 'encoder_missed_steps_decay_y', NULL), (NULL, 62, 2, 66, 'encoder_missed_steps_decay_z', NULL), (NULL, 63, 2, 67, 'encoder_use_for_pos_x', NULL), (NULL, 64, 2, 68, 'encoder_use_for_pos_y', NULL), (NULL, 65, 2, 69, 'encoder_use_for_pos_z', NULL), (NULL, 66, 2, 70, 'encoder_invert_x', NULL), (NULL, 67, 2, 71, 'encoder_invert_y', NULL), (NULL, 68, 2, 72, 'encoder_invert_z', NULL), (NULL, 69, 2, 73, 'movement_axis_nr_steps_x', NULL), (NULL, 70, 2, 74, 'movement_axis_nr_steps_y', NULL), (NULL, 71, 2, 75, 'movement_axis_nr_steps_z', NULL), (NULL, 72, 2, 76, 'movement_stop_at_max_x', NULL), (NULL, 73, 2, 77, 'movement_stop_at_max_y', NULL), (NULL, 74, 2, 78, 'movement_stop_at_max_z', NULL), (NULL, 75, 2, 79, 'pin_guard_1_pin_nr', NULL), (NULL, 76, 2, 80, 'pin_guard_1_time_out', NULL), (NULL, 77, 2, 81, 'pin_guard_1_active_state', NULL), (NULL, 78, 2, 82, 'pin_guard_2_pin_nr', NULL), (NULL, 79, 2, 83, 'pin_guard_2_time_out', NULL), (NULL, 80, 2, 84, 'pin_guard_2_active_state', NULL), (NULL, 81, 2, 85, 'pin_guard_3_pin_nr', NULL), (NULL, 82, 2, 86, 'pin_guard_3_time_out', NULL), (NULL, 83, 2, 87, 'pin_guard_3_active_state', NULL), (NULL, 84, 2, 88, 'pin_guard_4_pin_nr', NULL), (NULL, 85, 2, 89, 'pin_guard_4_time_out', NULL), (NULL, 86, 2, 90, 'pin_guard_4_active_state', NULL), (NULL, 87, 2, 91, 'pin_guard_5_pin_nr', NULL), (NULL, 88, 2, 92, 'pin_guard_5_time_out', NULL), (NULL, 89, 2, 93, 'pin_guard_5_active_state', NULL), (16, NULL, 3, 116, 'fw_upgrade_migration', NULL), (NULL, 92, 2, 122, 'movement_invert_2_endpoints_x', NULL), (NULL, 93, 2, 123, 'movement_invert_2_endpoints_y', NULL), (NULL, 94, 2, 124, 'movement_invert_2_endpoints_z', NULL), (NULL, NULL, 1, 126, 'secret', 11), (NULL, NULL, 3, 127, 'default_ntp_server_1', 12), (NULL, NULL, 3, 128, 'default_ntp_server_2', 13), (NULL, NULL, 3, 129, 'default_dns_name', 14), (17, NULL, 3, 130, 'firmware_needs_flash', NULL), (NULL, NULL, 3, 131, 'update_channel', 15), (18, NULL, 3, 132, 'firmware_needs_open', NULL);" + ) + end +end diff --git a/farmbot_os/priv/staging.pub b/priv/staging.pub similarity index 100% rename from farmbot_os/priv/staging.pub rename to priv/staging.pub diff --git a/farmbot_os/priv/static/farmbot_logo.png b/priv/static/farmbot_logo.png similarity index 100% rename from farmbot_os/priv/static/farmbot_logo.png rename to priv/static/farmbot_logo.png diff --git a/farmbot_os/priv/static/farmware_schema.json b/priv/static/farmware_schema.json similarity index 100% rename from farmbot_os/priv/static/farmware_schema.json rename to priv/static/farmware_schema.json diff --git a/farmbot_os/priv/static/favicon.ico b/priv/static/favicon.ico similarity index 100% rename from farmbot_os/priv/static/favicon.ico rename to priv/static/favicon.ico diff --git a/farmbot_os/priv/static/icon_ethernet.svg b/priv/static/icon_ethernet.svg similarity index 100% rename from farmbot_os/priv/static/icon_ethernet.svg rename to priv/static/icon_ethernet.svg diff --git a/farmbot_os/priv/static/icon_eye.svg b/priv/static/icon_eye.svg similarity index 100% rename from farmbot_os/priv/static/icon_eye.svg rename to priv/static/icon_eye.svg diff --git a/farmbot_os/priv/static/icon_key.svg b/priv/static/icon_key.svg similarity index 100% rename from farmbot_os/priv/static/icon_key.svg rename to priv/static/icon_key.svg diff --git a/farmbot_os/priv/static/icon_lock.svg b/priv/static/icon_lock.svg similarity index 100% rename from farmbot_os/priv/static/icon_lock.svg rename to priv/static/icon_lock.svg diff --git a/farmbot_os/priv/static/icon_none.svg b/priv/static/icon_none.svg similarity index 100% rename from farmbot_os/priv/static/icon_none.svg rename to priv/static/icon_none.svg diff --git a/farmbot_os/priv/static/icon_unknown.svg b/priv/static/icon_unknown.svg similarity index 100% rename from farmbot_os/priv/static/icon_unknown.svg rename to priv/static/icon_unknown.svg diff --git a/farmbot_os/priv/static/icon_wifi.svg b/priv/static/icon_wifi.svg similarity index 100% rename from farmbot_os/priv/static/icon_wifi.svg rename to priv/static/icon_wifi.svg diff --git a/farmbot_os/priv/static/logger.js b/priv/static/logger.js similarity index 100% rename from farmbot_os/priv/static/logger.js rename to priv/static/logger.js diff --git a/farmbot_os/priv/static/security_icon_lookup.js b/priv/static/security_icon_lookup.js similarity index 100% rename from farmbot_os/priv/static/security_icon_lookup.js rename to priv/static/security_icon_lookup.js diff --git a/farmbot_os/priv/static/styles.css b/priv/static/styles.css similarity index 100% rename from farmbot_os/priv/static/styles.css rename to priv/static/styles.css diff --git a/farmbot_os/priv/static/telemetry.html b/priv/static/telemetry.html similarity index 100% rename from farmbot_os/priv/static/telemetry.html rename to priv/static/telemetry.html diff --git a/farmbot_os/priv/static/telemetry.js b/priv/static/telemetry.js similarity index 100% rename from farmbot_os/priv/static/telemetry.js rename to priv/static/telemetry.js diff --git a/farmbot_os/priv/static/templates/advanced_network.html.eex b/priv/static/templates/advanced_network.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/advanced_network.html.eex rename to priv/static/templates/advanced_network.html.eex diff --git a/farmbot_os/priv/static/templates/config_wired.html.eex b/priv/static/templates/config_wired.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wired.html.eex rename to priv/static/templates/config_wired.html.eex diff --git a/farmbot_os/priv/static/templates/config_wireless_step_1.html.eex b/priv/static/templates/config_wireless_step_1.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wireless_step_1.html.eex rename to priv/static/templates/config_wireless_step_1.html.eex diff --git a/farmbot_os/priv/static/templates/config_wireless_step_2_EAP.html.eex b/priv/static/templates/config_wireless_step_2_EAP.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wireless_step_2_EAP.html.eex rename to priv/static/templates/config_wireless_step_2_EAP.html.eex diff --git a/farmbot_os/priv/static/templates/config_wireless_step_2_NONE.html.eex b/priv/static/templates/config_wireless_step_2_NONE.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wireless_step_2_NONE.html.eex rename to priv/static/templates/config_wireless_step_2_NONE.html.eex diff --git a/farmbot_os/priv/static/templates/config_wireless_step_2_PSK.html.eex b/priv/static/templates/config_wireless_step_2_PSK.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wireless_step_2_PSK.html.eex rename to priv/static/templates/config_wireless_step_2_PSK.html.eex diff --git a/farmbot_os/priv/static/templates/config_wireless_step_2_custom.html.eex b/priv/static/templates/config_wireless_step_2_custom.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wireless_step_2_custom.html.eex rename to priv/static/templates/config_wireless_step_2_custom.html.eex diff --git a/farmbot_os/priv/static/templates/config_wireless_step_2_other.html.eex b/priv/static/templates/config_wireless_step_2_other.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/config_wireless_step_2_other.html.eex rename to priv/static/templates/config_wireless_step_2_other.html.eex diff --git a/farmbot_os/priv/static/templates/credentials.html.eex b/priv/static/templates/credentials.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/credentials.html.eex rename to priv/static/templates/credentials.html.eex diff --git a/farmbot_os/priv/static/templates/finish.html.eex b/priv/static/templates/finish.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/finish.html.eex rename to priv/static/templates/finish.html.eex diff --git a/farmbot_os/priv/static/templates/firmware.html.eex b/priv/static/templates/firmware.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/firmware.html.eex rename to priv/static/templates/firmware.html.eex diff --git a/farmbot_os/priv/static/templates/index.html.eex b/priv/static/templates/index.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/index.html.eex rename to priv/static/templates/index.html.eex diff --git a/farmbot_os/priv/static/templates/logger.html.eex b/priv/static/templates/logger.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/logger.html.eex rename to priv/static/templates/logger.html.eex diff --git a/farmbot_os/priv/static/templates/network.html.eex b/priv/static/templates/network.html.eex similarity index 100% rename from farmbot_os/priv/static/templates/network.html.eex rename to priv/static/templates/network.html.eex diff --git a/farmbot_os/rel/vm.args.eex b/rel/vm.args.eex similarity index 100% rename from farmbot_os/rel/vm.args.eex rename to rel/vm.args.eex diff --git a/farmbot_os/rootfs_overlay/etc/iex.exs b/rootfs_overlay/etc/iex.exs similarity index 100% rename from farmbot_os/rootfs_overlay/etc/iex.exs rename to rootfs_overlay/etc/iex.exs diff --git a/farmbot_os/rootfs_overlay/farmware/test.txt b/rootfs_overlay/farmware/test.txt similarity index 100% rename from farmbot_os/rootfs_overlay/farmware/test.txt rename to rootfs_overlay/farmware/test.txt diff --git a/farmbot_os/rootfs_overlay/usr/share/alsa/alsa.conf b/rootfs_overlay/usr/share/alsa/alsa.conf similarity index 100% rename from farmbot_os/rootfs_overlay/usr/share/alsa/alsa.conf rename to rootfs_overlay/usr/share/alsa/alsa.conf diff --git a/run_all.sh b/run_all.sh index 160477e83..efc25a740 100755 --- a/run_all.sh +++ b/run_all.sh @@ -5,43 +5,15 @@ set -o pipefail export MIX_ENV=test -cd farmbot_telemetry - -echo "######### farmbot_telemetry" -cd ../farmbot_telemetry +echo "######### Fetch Deps" mix deps.get --all mix format MIX_ENV=test mix compile --force -mix coveralls.html -rm -f *.coverdata -echo "######### farmbot_core" -cd ../farmbot_core -mix deps.get --all -mix format -MIX_ENV=test mix compile --force +echo "######### Run Tests" mix coveralls.html rm -f *.coverdata -echo "######### farmbot_ext" -cd ../farmbot_ext -mix deps.get --all -mix format -MIX_ENV=test mix compile --force -mix coveralls.html -rm -f *.coverdata - -echo "######### farmbot_os" -cd ../farmbot_os -mix deps.get --all -mix format -MIX_ENV=test mix compile --force -mix coveralls.html -rm -f *.coverdata - -cd .. -cd farmbot_os - echo "######### Build RPI3 FW" MIX_TARGET=rpi3 MIX_ENV=prod mix deps.get diff --git a/farmbot_core/test/asset/box_led_test.exs b/test/asset/box_led_test.exs similarity index 100% rename from farmbot_core/test/asset/box_led_test.exs rename to test/asset/box_led_test.exs diff --git a/farmbot_core/test/asset/command_test.exs b/test/asset/command_test.exs similarity index 100% rename from farmbot_core/test/asset/command_test.exs rename to test/asset/command_test.exs diff --git a/farmbot_core/test/asset/criteria_retriever_test.exs b/test/asset/criteria_retriever_test.exs similarity index 100% rename from farmbot_core/test/asset/criteria_retriever_test.exs rename to test/asset/criteria_retriever_test.exs diff --git a/farmbot_core/test/asset/device_test.exs b/test/asset/device_test.exs similarity index 100% rename from farmbot_core/test/asset/device_test.exs rename to test/asset/device_test.exs diff --git a/farmbot_core/test/asset/farm_event_body_node_test.exs b/test/asset/farm_event_body_node_test.exs similarity index 100% rename from farmbot_core/test/asset/farm_event_body_node_test.exs rename to test/asset/farm_event_body_node_test.exs diff --git a/farmbot_core/test/asset/farm_event_test.exs b/test/asset/farm_event_test.exs similarity index 100% rename from farmbot_core/test/asset/farm_event_test.exs rename to test/asset/farm_event_test.exs diff --git a/farmbot_core/test/asset/farmware_env_test.exs b/test/asset/farmware_env_test.exs similarity index 100% rename from farmbot_core/test/asset/farmware_env_test.exs rename to test/asset/farmware_env_test.exs diff --git a/farmbot_core/test/asset/farmware_installation_test.exs b/test/asset/farmware_installation_test.exs similarity index 100% rename from farmbot_core/test/asset/farmware_installation_test.exs rename to test/asset/farmware_installation_test.exs diff --git a/farmbot_core/test/asset/farmware_manifest_test.exs b/test/asset/farmware_manifest_test.exs similarity index 100% rename from farmbot_core/test/asset/farmware_manifest_test.exs rename to test/asset/farmware_manifest_test.exs diff --git a/farmbot_core/test/asset/fbos_config_test.exs b/test/asset/fbos_config_test.exs similarity index 100% rename from farmbot_core/test/asset/fbos_config_test.exs rename to test/asset/fbos_config_test.exs diff --git a/farmbot_core/test/asset/firmware_config_test.exs b/test/asset/firmware_config_test.exs similarity index 100% rename from farmbot_core/test/asset/firmware_config_test.exs rename to test/asset/firmware_config_test.exs diff --git a/farmbot_core/test/asset/first_party_farmware_test.exs b/test/asset/first_party_farmware_test.exs similarity index 100% rename from farmbot_core/test/asset/first_party_farmware_test.exs rename to test/asset/first_party_farmware_test.exs diff --git a/farmbot_core/test/asset/peripheral_test.exs b/test/asset/peripheral_test.exs similarity index 100% rename from farmbot_core/test/asset/peripheral_test.exs rename to test/asset/peripheral_test.exs diff --git a/farmbot_core/test/asset/pin_binding_test.exs b/test/asset/pin_binding_test.exs similarity index 100% rename from farmbot_core/test/asset/pin_binding_test.exs rename to test/asset/pin_binding_test.exs diff --git a/farmbot_core/test/asset/point_group_test.exs b/test/asset/point_group_test.exs similarity index 100% rename from farmbot_core/test/asset/point_group_test.exs rename to test/asset/point_group_test.exs diff --git a/farmbot_core/test/asset/point_test.exs b/test/asset/point_test.exs similarity index 100% rename from farmbot_core/test/asset/point_test.exs rename to test/asset/point_test.exs diff --git a/farmbot_core/test/asset/private_test.exs b/test/asset/private_test.exs similarity index 88% rename from farmbot_core/test/asset/private_test.exs rename to test/asset/private_test.exs index 2e95f35e1..822168803 100644 --- a/farmbot_core/test/asset/private_test.exs +++ b/test/asset/private_test.exs @@ -45,15 +45,6 @@ defmodule FarmbotCore.Asset.PrivateTest do reset_assets() end - test "mark_stale! / any_stale?" do - destroy_assets() - %{FirmwareConfig => firmware_config} = create_assets() - refute Private.any_stale?() - Private.mark_stale!(firmware_config) - assert Private.any_stale?() - reset_assets() - end - test "mark_dirty! / list_dirty" do Map.keys(@assets) |> Enum.map(fn mod -> diff --git a/farmbot_core/test/asset/public_key_test.exs b/test/asset/public_key_test.exs similarity index 100% rename from farmbot_core/test/asset/public_key_test.exs rename to test/asset/public_key_test.exs diff --git a/farmbot_core/test/asset/regimen_body_node_test.exs b/test/asset/regimen_body_node_test.exs similarity index 100% rename from farmbot_core/test/asset/regimen_body_node_test.exs rename to test/asset/regimen_body_node_test.exs diff --git a/farmbot_core/test/asset/regimen_item_test.exs b/test/asset/regimen_item_test.exs similarity index 100% rename from farmbot_core/test/asset/regimen_item_test.exs rename to test/asset/regimen_item_test.exs diff --git a/farmbot_core/test/asset/regimen_test.exs b/test/asset/regimen_test.exs similarity index 100% rename from farmbot_core/test/asset/regimen_test.exs rename to test/asset/regimen_test.exs diff --git a/farmbot_core/test/asset/sensor_reading_test.exs b/test/asset/sensor_reading_test.exs similarity index 100% rename from farmbot_core/test/asset/sensor_reading_test.exs rename to test/asset/sensor_reading_test.exs diff --git a/farmbot_core/test/asset/sensor_test.exs b/test/asset/sensor_test.exs similarity index 100% rename from farmbot_core/test/asset/sensor_test.exs rename to test/asset/sensor_test.exs diff --git a/farmbot_core/test/asset/sequence_test.exs b/test/asset/sequence_test.exs similarity index 100% rename from farmbot_core/test/asset/sequence_test.exs rename to test/asset/sequence_test.exs diff --git a/farmbot_core/test/asset/storage_auth_test.exs b/test/asset/storage_auth_test.exs similarity index 100% rename from farmbot_core/test/asset/storage_auth_test.exs rename to test/asset/storage_auth_test.exs diff --git a/farmbot_core/test/asset/sync_item_test.exs b/test/asset/sync_item_test.exs similarity index 100% rename from farmbot_core/test/asset/sync_item_test.exs rename to test/asset/sync_item_test.exs diff --git a/farmbot_core/test/asset/sync_test.exs b/test/asset/sync_test.exs similarity index 100% rename from farmbot_core/test/asset/sync_test.exs rename to test/asset/sync_test.exs diff --git a/farmbot_core/test/asset/tool_test.exs b/test/asset/tool_test.exs similarity index 100% rename from farmbot_core/test/asset/tool_test.exs rename to test/asset/tool_test.exs diff --git a/farmbot_core/test/asset/view_test.exs b/test/asset/view_test.exs similarity index 100% rename from farmbot_core/test/asset/view_test.exs rename to test/asset/view_test.exs diff --git a/test/support/asset_fixtures.ex b/test/asset_fixtures.exs similarity index 100% rename from test/support/asset_fixtures.ex rename to test/asset_fixtures.exs diff --git a/farmbot_core/test/asset_helpers_test.exs b/test/asset_helpers_test.exs similarity index 100% rename from farmbot_core/test/asset_helpers_test.exs rename to test/asset_helpers_test.exs diff --git a/farmbot_core/test/asset_test.exs b/test/asset_test.exs similarity index 96% rename from farmbot_core/test/asset_test.exs rename to test/asset_test.exs index ad435ea4c..2f2a56b3f 100644 --- a/farmbot_core/test/asset_test.exs +++ b/test/asset_test.exs @@ -11,6 +11,7 @@ defmodule FarmbotCore.AssetTest do describe "regimen instances" do test "creates a regimen instance" do + Asset.update_device!(%{timezone: "America/Chicago"}) seq = sequence() reg = diff --git a/farmbot_core/test/asset_workers/device_worker_test.exs b/test/asset_workers/device_worker_test.exs similarity index 96% rename from farmbot_core/test/asset_workers/device_worker_test.exs rename to test/asset_workers/device_worker_test.exs index f0d3827c8..a26755b95 100644 --- a/farmbot_core/test/asset_workers/device_worker_test.exs +++ b/test/asset_workers/device_worker_test.exs @@ -3,7 +3,7 @@ defmodule FarmbotCore.DeviceWorkerTest do use Mimic alias Farmbot.TestSupport.AssetFixtures - alias FarmbotCore.Celery.SysCalls.Stubs + alias FarmbotCore.Celery.SysCallGlue.Stubs alias FarmbotCore.Asset.Device alias FarmbotCore.AssetWorker diff --git a/farmbot_core/test/asset_workers/farm_event_worker/regimen_event_test.exs b/test/asset_workers/farm_event_worker/regimen_event_test.exs similarity index 93% rename from farmbot_core/test/asset_workers/farm_event_worker/regimen_event_test.exs rename to test/asset_workers/farm_event_worker/regimen_event_test.exs index 1f2658a29..950e7d693 100644 --- a/farmbot_core/test/asset_workers/farm_event_worker/regimen_event_test.exs +++ b/test/asset_workers/farm_event_worker/regimen_event_test.exs @@ -2,6 +2,7 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEventTest do use ExUnit.Case alias FarmbotCore.FarmEventWorker.RegimenEvent alias Farmbot.TestSupport.AssetFixtures + alias FarmbotCore.Asset import ExUnit.CaptureLog require Logger use Mimic @@ -57,6 +58,7 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEventTest do end test "handles regimen instance exists" do + FarmbotCore.Asset.update_device!(%{timezone: "America/Chicago"}) regimen = AssetFixtures.regimen(%{}) farm_event = AssetFixtures.regimen_event(regimen, %{}) args = %{} @@ -87,6 +89,7 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEventTest do end test "creates regimen instance" do + FarmbotCore.Asset.update_device!(%{timezone: "America/Chicago"}) regimen = AssetFixtures.regimen(%{}) farm_event = AssetFixtures.regimen_event(regimen, %{}) args = %{} @@ -106,6 +109,7 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEventTest do end test "removes regimen instance" do + FarmbotCore.Asset.update_device!(%{timezone: "America/Chicago"}) regimen = AssetFixtures.regimen(%{}) farm_event = AssetFixtures.regimen_event(regimen, %{}) args = %{} @@ -135,6 +139,7 @@ defmodule FarmbotCore.FarmEventWorker.RegimenEventTest do end test "changes regimen instance" do + Asset.update_device!(%{timezone: "America/Chicago"}) regimen = AssetFixtures.regimen(%{}) farm_event = AssetFixtures.regimen_event(regimen, %{}) args = %{} diff --git a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs b/test/asset_workers/farm_event_worker/sequence_event_test.exs similarity index 61% rename from farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs rename to test/asset_workers/farm_event_worker/sequence_event_test.exs index a210d2992..903835bbd 100644 --- a/farmbot_core/test/asset_workers/farm_event_worker/sequence_event_test.exs +++ b/test/asset_workers/farm_event_worker/sequence_event_test.exs @@ -11,7 +11,7 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do assert_receive :schedule, 1000 end - test "handle_info(:schedule, state) - Synchronized" do + test "handle_info(:schedule, state)" do state = %{ args: [], farm_event: %FarmbotCore.Asset.FarmEvent{ @@ -33,10 +33,6 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do timesync_waits: 0 } - expect(NervesTime, :synchronized?, 1, fn -> - true - end) - expect(FarmbotCore.Celery, :schedule, 25, fn celery_ast, _at, farm_event -> assert %FarmbotCore.Celery.AST{} = celery_ast assert state.farm_event.id == farm_event.id @@ -61,33 +57,4 @@ defmodule FarmbotCore.FarmEventWorker.SequenceTest do assert state2.scheduled == 50 assert state2.timesync_waits == 0 end - - test "handle_info(:schedule, state) - Not synchronized" do - state = %{ - args: [], - farm_event: %FarmbotCore.Asset.FarmEvent{ - body: [], - created_at: ~U[2021-10-08 21:28:19.200000Z], - end_time: ~U[2051-10-09 22:30:00.000000Z], - executable_id: 2, - executable_type: "Sequence", - executions: [], - id: 1, - last_executed: nil, - local_id: "6fae5451-baa8-4368-9612-cfd571384814", - repeat: 1, - start_time: ~U[2051-10-08 21:30:00.000000Z], - time_unit: "hourly", - updated_at: ~U[2051-10-08 21:28:19.294000Z] - }, - scheduled: 25, - timesync_waits: 0 - } - - {:noreply, state2, timeout} = SequenceEvent.handle_info(:schedule, state) - assert timeout == 3000 - assert state2.farm_event.local_id == state2.farm_event.local_id - assert state2.scheduled == 25 - assert state2.timesync_waits == 1 - end end diff --git a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs b/test/asset_workers/pin_binding_worker_test.exs similarity index 83% rename from farmbot_core/test/asset_workers/pin_binding_worker_test.exs rename to test/asset_workers/pin_binding_worker_test.exs index 15e14ebf9..b3d665c01 100644 --- a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs +++ b/test/asset_workers/pin_binding_worker_test.exs @@ -15,7 +15,7 @@ defmodule FarmbotCore.PinBindingWorkerTest do } } - expect(FarmbotCore.Celery.SysCalls, :reboot, fn -> :ok end) + expect(FarmbotCore.Celery.SysCallGlue, :reboot, fn -> :ok end) PinBinding.handle_cast(:trigger, params) end @@ -27,7 +27,7 @@ defmodule FarmbotCore.PinBindingWorkerTest do } } - expect(FarmbotCore.Celery.SysCalls, :sync, fn -> :ok end) + expect(FarmbotCore.Celery.SysCallGlue, :sync, fn -> :ok end) PinBinding.handle_cast(:trigger, params) end end diff --git a/farmbot_core/test/asset_workers/regimen_instance_worker_test.exs b/test/asset_workers/regimen_instance_worker_test.exs similarity index 91% rename from farmbot_core/test/asset_workers/regimen_instance_worker_test.exs rename to test/asset_workers/regimen_instance_worker_test.exs index f9ff59bfd..27f12ad59 100644 --- a/farmbot_core/test/asset_workers/regimen_instance_worker_test.exs +++ b/test/asset_workers/regimen_instance_worker_test.exs @@ -6,6 +6,7 @@ defmodule FarmbotCore.RegimenInstanceAssetWorkerTest do describe "regimen instance worker" do test "schedules sequence" do + FarmbotCore.Asset.update_device!(%{timezone: "America/Chicago"}) seq = AssetFixtures.sequence() regimen_instance = diff --git a/farmbot_core/test/bot_state/filesystem_test.exs b/test/bot_state/filesystem_test.exs similarity index 100% rename from farmbot_core/test/bot_state/filesystem_test.exs rename to test/bot_state/filesystem_test.exs diff --git a/farmbot_core/test/bot_state/job_progress_test.exs b/test/bot_state/job_progress_test.exs similarity index 100% rename from farmbot_core/test/bot_state/job_progress_test.exs rename to test/bot_state/job_progress_test.exs diff --git a/farmbot_core/test/bot_state_ng_test.exs b/test/bot_state_ng_test.exs similarity index 100% rename from farmbot_core/test/bot_state_ng_test.exs rename to test/bot_state_ng_test.exs diff --git a/farmbot_core/test/bot_state_test.exs b/test/bot_state_test.exs similarity index 100% rename from farmbot_core/test/bot_state_test.exs rename to test/bot_state_test.exs diff --git a/farmbot_core/test/calendar_test.exs b/test/calendar_test.exs similarity index 100% rename from farmbot_core/test/calendar_test.exs rename to test/calendar_test.exs diff --git a/farmbot_core/test/config_storage/group_test.exs b/test/config_storage/group_test.exs similarity index 100% rename from farmbot_core/test/config_storage/group_test.exs rename to test/config_storage/group_test.exs diff --git a/farmbot_core/test/config_storage/string_value_test.exs b/test/config_storage/string_value_test.exs similarity index 100% rename from farmbot_core/test/config_storage/string_value_test.exs rename to test/config_storage/string_value_test.exs diff --git a/farmbot_core/test/dot_props_test.exs b/test/dot_props_test.exs similarity index 100% rename from farmbot_core/test/dot_props_test.exs rename to test/dot_props_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs b/test/farmbot_celery_script/assertion_compiler_test.exs similarity index 92% rename from farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs rename to test/farmbot_celery_script/assertion_compiler_test.exs index 62a83e4d7..f78755de0 100644 --- a/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs +++ b/test/farmbot_celery_script/assertion_compiler_test.exs @@ -7,7 +7,7 @@ defmodule FarmbotCore.Celery.AssertionCompilerTest do test "Assertion.assertion/2" do scope = Scope.new() - expect(FarmbotCore.Celery.SysCalls, :log_assertion, 1, fn ok?, t, msg -> + expect(FarmbotCore.Celery.SysCallGlue, :log_assertion, 1, fn ok?, t, msg -> refute ok? assert t == "abort" assert msg == "[comment] failed to evaluate, aborting" diff --git a/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs b/test/farmbot_celery_script/ast/factory_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/ast/factory_test.exs rename to test/farmbot_celery_script/ast/factory_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/ast_test.exs b/test/farmbot_celery_script/ast_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/ast_test.exs rename to test/farmbot_celery_script/ast_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs b/test/farmbot_celery_script/compiler_groups_test.exs similarity index 81% rename from farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs rename to test/farmbot_celery_script/compiler_groups_test.exs index 300ec3d55..a76d322da 100644 --- a/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs +++ b/test/farmbot_celery_script/compiler_groups_test.exs @@ -22,12 +22,12 @@ defmodule FarmbotCore.Celery.CompilerGroupsTest do fun end) - expect(FarmbotCore.Celery.SysCalls, :sequence_init_log, 1, fn log -> + expect(FarmbotCore.Celery.SysCallGlue, :sequence_init_log, 1, fn log -> assert log == "[4/8] Starting test sequence" :ok end) - expect(FarmbotCore.Celery.SysCalls, :sequence_complete_log, 1, fn log -> + expect(FarmbotCore.Celery.SysCallGlue, :sequence_complete_log, 1, fn log -> assert log == "Completed test sequence" :ok end) diff --git a/farmbot_core/test/farmbot_celery_script/compiler_test.exs b/test/farmbot_celery_script/compiler_test.exs similarity index 82% rename from farmbot_core/test/farmbot_celery_script/compiler_test.exs rename to test/farmbot_celery_script/compiler_test.exs index afe13b754..20b47af25 100644 --- a/farmbot_core/test/farmbot_celery_script/compiler_test.exs +++ b/test/farmbot_celery_script/compiler_test.exs @@ -5,7 +5,7 @@ defmodule FarmbotCore.Celery.CompilerTest do alias FarmbotCore.Celery.{AST, Compiler} alias FarmbotCore.Celery.Compiler.Scope # Only required to compile - alias FarmbotCore.Celery.SysCalls, warn: false + alias FarmbotCore.Celery.SysCallGlue, warn: false test "change_ownership" do email = "t@g.com" @@ -18,9 +18,9 @@ defmodule FarmbotCore.Celery.CompilerTest do %{args: %{label: "server", value: server}} ] - expect(FarmbotCore.Celery.SysCalls, :change_ownership, 1, fn eml, - scrt, - srvr -> + expect(FarmbotCore.Celery.SysCallGlue, :change_ownership, 1, fn eml, + scrt, + srvr -> assert eml == email assert scrt == "\xB2\xEA^\xAD۩z" assert srvr == server @@ -40,7 +40,7 @@ defmodule FarmbotCore.Celery.CompilerTest do msg = "Hello, world!" args = %{args: %{message: msg, message_type: type}, body: channels} - expect(FarmbotCore.Celery.SysCalls, :send_message, 1, fn t, m, c -> + expect(FarmbotCore.Celery.SysCallGlue, :send_message, 1, fn t, m, c -> assert t == type assert m == msg assert c == [:email] @@ -116,8 +116,8 @@ defmodule FarmbotCore.Celery.CompilerTest do strip_nl(""" package = "take-photo" env = %{"a" => "123"} - FarmbotCore.Celery.SysCalls.log(\"Taking photo\", true) - FarmbotCore.Celery.SysCalls.execute_script(package, env) + FarmbotCore.Celery.SysCallGlue.log(\"Taking photo\", true) + FarmbotCore.Celery.SysCallGlue.execute_script(package, env) """) end @@ -134,8 +134,8 @@ defmodule FarmbotCore.Celery.CompilerTest do assert compiled == strip_nl(""" - FarmbotCore.Celery.SysCalls.set_user_env("a", "123") - FarmbotCore.Celery.SysCalls.set_user_env("b", "345") + FarmbotCore.Celery.SysCallGlue.set_user_env("a", "123") + FarmbotCore.Celery.SysCallGlue.set_user_env("b", "345") """) end @@ -149,8 +149,8 @@ defmodule FarmbotCore.Celery.CompilerTest do assert compiled == strip_nl(""" - FarmbotCore.Celery.SysCalls.log("Installing dependencies...") - FarmbotCore.Celery.SysCalls.install_first_party_farmware() + FarmbotCore.Celery.SysCallGlue.log("Installing dependencies...") + FarmbotCore.Celery.SysCallGlue.install_first_party_farmware() """) end @@ -164,17 +164,17 @@ defmodule FarmbotCore.Celery.CompilerTest do assert compiled == strip_nl(""" - FarmbotCore.Celery.SysCalls.nothing() + FarmbotCore.Celery.SysCallGlue.nothing() """) end test "compiles move_absolute with tool_id" do - expect(SysCalls.Stubs, :get_toolslot_for_tool, 1, fn + expect(SysCallGlue.Stubs, :get_toolslot_for_tool, 1, fn 222 -> %{gantry_mounted: false, name: "X", x: 220, y: 221, z: 222} id -> raise "Wrong id: #{id}" end) - expect(SysCalls.Stubs, :move_absolute, 1, fn x, y, z, s -> + expect(SysCallGlue.Stubs, :move_absolute, 1, fn x, y, z, s -> assert {219, 220, 221, 100} == {x, y, z, s} :ok end) @@ -225,7 +225,7 @@ defmodule FarmbotCore.Celery.CompilerTest do }) expected = - "[x, y, z] = [100 + -20, 100 + -20, 100 + -20] x_str = FarmbotCore.Celery.FormatUtil.format_float(x) y_str = FarmbotCore.Celery.FormatUtil.format_float(y) z_str = FarmbotCore.Celery.FormatUtil.format_float(z) FarmbotCore.Celery.SysCalls.log(\"Moving to (\#{x_str}, \#{y_str}, \#{z_str})\", true) FarmbotCore.Celery.SysCalls.move_absolute(x, y, z, 100)" + "[x, y, z] = [100 + -20, 100 + -20, 100 + -20] x_str = FarmbotCore.Celery.FormatUtil.format_float(x) y_str = FarmbotCore.Celery.FormatUtil.format_float(y) z_str = FarmbotCore.Celery.FormatUtil.format_float(z) FarmbotCore.Celery.SysCallGlue.log(\"Moving to (\#{x_str}, \#{y_str}, \#{z_str})\", true) FarmbotCore.Celery.SysCallGlue.move_absolute(x, y, z, 100)" assert compiled == expected end @@ -248,9 +248,9 @@ defmodule FarmbotCore.Celery.CompilerTest do locx when is_number(locx) <- 100.4, locy when is_number(locy) <- 90, locz when is_number(locz) <- 50, - curx when is_number(curx) <- FarmbotCore.Celery.SysCalls.get_current_x(), - cury when is_number(cury) <- FarmbotCore.Celery.SysCalls.get_current_y(), - curz when is_number(curz) <- FarmbotCore.Celery.SysCalls.get_current_z() + curx when is_number(curx) <- FarmbotCore.Celery.SysCallGlue.get_current_x(), + cury when is_number(cury) <- FarmbotCore.Celery.SysCallGlue.get_current_y(), + curz when is_number(curz) <- FarmbotCore.Celery.SysCallGlue.get_current_z() ) do x = locx + curx y = locy + cury @@ -258,8 +258,8 @@ defmodule FarmbotCore.Celery.CompilerTest do x_str = FarmbotCore.Celery.FormatUtil.format_float(x) y_str = FarmbotCore.Celery.FormatUtil.format_float(y) z_str = FarmbotCore.Celery.FormatUtil.format_float(z) - FarmbotCore.Celery.SysCalls.log("Moving relative to (\#{x_str}, \#{y_str}, \#{z_str})", true) - FarmbotCore.Celery.SysCalls.move_absolute(x, y, z, 100) + FarmbotCore.Celery.SysCallGlue.log("Moving relative to (\#{x_str}, \#{y_str}, \#{z_str})", true) + FarmbotCore.Celery.SysCallGlue.move_absolute(x, y, z, 100) end """) end @@ -273,7 +273,7 @@ defmodule FarmbotCore.Celery.CompilerTest do # expected = # "pin = 17\nmode = 0\nvalue = 1\n\nwith(:ok <- " <> - # "FarmbotCore.Celery.SysCalls.write_pin(pin, mode, value))" <> + # "FarmbotCore.Celery.SysCallGlue.write_pin(pin, mode, value))" <> # " do\n me = FarmbotCore.Celery.Compiler.PinControl\n" <> # " me.conclude(pin, mode, value)\nend" @@ -291,7 +291,7 @@ defmodule FarmbotCore.Celery.CompilerTest do strip_nl(""" pin = 23 mode = 0 - FarmbotCore.Celery.SysCalls.read_pin(pin, mode) + FarmbotCore.Celery.SysCallGlue.read_pin(pin, mode) """) end @@ -306,8 +306,8 @@ defmodule FarmbotCore.Celery.CompilerTest do strip_nl(""" pin = 23 angle = 90 - FarmbotCore.Celery.SysCalls.log("Writing servo: \#{pin}: \#{angle}") - FarmbotCore.Celery.SysCalls.set_servo_angle(pin, angle) + FarmbotCore.Celery.SysCallGlue.log("Writing servo: \#{pin}: \#{angle}") + FarmbotCore.Celery.SysCallGlue.set_servo_angle(pin, angle) """) end @@ -322,8 +322,8 @@ defmodule FarmbotCore.Celery.CompilerTest do strip_nl(""" pin = 23 mode = "input" - FarmbotCore.Celery.SysCalls.log("Setting pin mode: \#{pin}: \#{mode}") - FarmbotCore.Celery.SysCalls.set_pin_io_mode(pin, mode) + FarmbotCore.Celery.SysCallGlue.log("Setting pin mode: \#{pin}: \#{mode}") + FarmbotCore.Celery.SysCallGlue.set_pin_io_mode(pin, mode) """) end diff --git a/farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs b/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs similarity index 76% rename from farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs rename to test/farmbot_celery_script/compilers/pin_control_compilers_test.exs index 2b1fda865..0171a6ac8 100644 --- a/farmbot_core/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs +++ b/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs @@ -6,13 +6,13 @@ defmodule FarmbotCore.Celery.Compiler.PinControlTest do alias FarmbotCore.Celery.Compiler.PinControl test "conclude/3" do - expect(FarmbotCore.Celery.SysCalls, :read_pin, fn pin, mode -> + expect(FarmbotCore.Celery.SysCallGlue, :read_pin, fn pin, mode -> assert pin == 1 assert mode == 0 :ok end) - expect(FarmbotCore.Celery.SysCalls, :log, fn msg -> + expect(FarmbotCore.Celery.SysCallGlue, :log, fn msg -> expected = "Pin 3 is 4 (analog)" assert msg == expected :ok diff --git a/farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs b/test/farmbot_celery_script/corpus/arg_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs rename to test/farmbot_celery_script/corpus/arg_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/corpus/node_test.exs b/test/farmbot_celery_script/corpus/node_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/corpus/node_test.exs rename to test/farmbot_celery_script/corpus/node_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/corpus_test.exs b/test/farmbot_celery_script/corpus_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/corpus_test.exs rename to test/farmbot_celery_script/corpus_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/integration_test.exs b/test/farmbot_celery_script/integration_test.exs similarity index 65% rename from farmbot_core/test/farmbot_celery_script/integration_test.exs rename to test/farmbot_celery_script/integration_test.exs index cd884800a..24cfda7e8 100644 --- a/farmbot_core/test/farmbot_celery_script/integration_test.exs +++ b/test/farmbot_celery_script/integration_test.exs @@ -11,24 +11,24 @@ defmodule FarmbotCore.Celery.IntegrationTest do @fixtures [ "test/fixtures/execute.json", - "fixture/inner_sequence.json", - "fixture/every_sequence.json", - "fixture/outer_sequence.json", - "fixture/paramater_sequence.json", - "fixture/point_group_sequence.json", + "fixtures/inner_sequence.json", + "fixtures/every_sequence.json", + "fixtures/outer_sequence.json", + "fixtures/paramater_sequence.json", + "fixtures/point_group_sequence.json", "test/fixtures/mark_variable_meta.json", "test/fixtures/mark_variable_removed.json", "test/fixtures/set_mounted_tool_id.json", "test/fixtures/update_resource_multi.json" - # "fixture/unbound.json", + # "fixtures/unbound.json", ] test "all the fixtures (should not crash!)" do - expect(FarmbotCore.Celery.SysCalls, :get_sequence, 7, fn _id -> - compile_celery_file("fixture/inner_sequence.json") + expect(FarmbotCore.Celery.SysCallGlue, :get_sequence, 7, fn _id -> + compile_celery_file("fixtures/inner_sequence.json") end) - expect(FarmbotCore.Celery.SysCalls, :point, 12, fn _type, _id -> + expect(FarmbotCore.Celery.SysCallGlue, :point, 12, fn _type, _id -> %{x: 99, y: 88, z: 77} end) diff --git a/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs b/test/farmbot_celery_script/lua_compiler_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs rename to test/farmbot_celery_script/lua_compiler_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs b/test/farmbot_celery_script/move_compiler_test.exs similarity index 99% rename from farmbot_core/test/farmbot_celery_script/move_compiler_test.exs rename to test/farmbot_celery_script/move_compiler_test.exs index e2a11f21c..d34f01511 100644 --- a/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs +++ b/test/farmbot_celery_script/move_compiler_test.exs @@ -5,10 +5,10 @@ defmodule FarmbotCore.Celery.MoveCompilerTest do alias FarmbotCore.Celery.{ Compiler, Compiler.Move, - SysCalls.Stubs + SysCallGlue.Stubs } - alias FarmbotCore.Celery.SysCalls, warn: false + # alias FarmbotCore.Celery.SysCallGlue setup :verify_on_exit! diff --git a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs b/test/farmbot_celery_script/scheduler_test.exs similarity index 95% rename from farmbot_core/test/farmbot_celery_script/scheduler_test.exs rename to test/farmbot_celery_script/scheduler_test.exs index bac416b05..1f8a5cb20 100644 --- a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs +++ b/test/farmbot_celery_script/scheduler_test.exs @@ -2,7 +2,7 @@ defmodule FarmbotCore.Celery.SchedulerTest do use ExUnit.Case use Mimic alias FarmbotCore.Celery.{Scheduler, AST} - alias FarmbotCore.Celery.SysCalls.Stubs + alias FarmbotCore.Celery.SysCallGlue.Stubs import ExUnit.CaptureLog setup :set_mimic_global diff --git a/farmbot_core/test/farmbot_celery_script/scope_test.exs b/test/farmbot_celery_script/scope_test.exs similarity index 100% rename from farmbot_core/test/farmbot_celery_script/scope_test.exs rename to test/farmbot_celery_script/scope_test.exs diff --git a/farmbot_core/test/farmbot_celery_script/special_value_test.exs b/test/farmbot_celery_script/special_value_test.exs similarity index 91% rename from farmbot_core/test/farmbot_celery_script/special_value_test.exs rename to test/farmbot_celery_script/special_value_test.exs index 1fae5f73a..101124dd1 100644 --- a/farmbot_core/test/farmbot_celery_script/special_value_test.exs +++ b/test/farmbot_celery_script/special_value_test.exs @@ -3,23 +3,19 @@ defmodule FarmbotCore.Celery.SpecialValueTest do use Mimic alias FarmbotCore.Celery.SpecialValue - import ExUnit.CaptureLog + require Helpers setup :verify_on_exit! test "soil_height() (less than three soil height samples)" do - expect(FarmbotCore.Asset.Repo, :all, 1, fn _sql -> [] end) - - t = fn -> - refute FarmbotCore.Asset.fbos_config(:soil_height) - assert 0.0 == SpecialValue.soil_height(%{x: 0.0, y: 0.0}) - end - expected = "Need at least 3 soil height samples to guess" <> " soil height. Using fallback value instead: 0.0" - assert capture_log(t) =~ expected + Helpers.expect_log(expected) + expect(FarmbotCore.Asset.Repo, :all, 1, fn _sql -> [] end) + refute FarmbotCore.Asset.fbos_config(:soil_height) + assert 0.0 == SpecialValue.soil_height(%{x: 0.0, y: 0.0}) end test "soil_height() (more than three soil height samples)" do diff --git a/farmbot_core/test/farmbot_celery_script/sys_calls_test.exs b/test/farmbot_celery_script/sys_call_glue_test.exs similarity index 61% rename from farmbot_core/test/farmbot_celery_script/sys_calls_test.exs rename to test/farmbot_celery_script/sys_call_glue_test.exs index cef5c1420..12022e040 100644 --- a/farmbot_core/test/farmbot_celery_script/sys_calls_test.exs +++ b/test/farmbot_celery_script/sys_call_glue_test.exs @@ -1,10 +1,10 @@ -defmodule FarmbotCore.Celery.SysCallsTest do +defmodule FarmbotCore.Celery.SysCallGlueTest do use ExUnit.Case, async: false use Mimic alias FarmbotCore.Celery.{ - SysCalls, - SysCalls.Stubs, + SysCallGlue, + SysCallGlue.Stubs, AST } @@ -15,7 +15,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do %{x: 100, y: 200, z: 300} end) - result1 = SysCalls.point(Stubs, "Peripheral", 1) + result1 = SysCallGlue.point(Stubs, "Peripheral", 1) assert %{x: 100, y: 200, z: 300} == result1 end @@ -24,7 +24,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do :whatever end) - boom = fn -> SysCalls.point(Stubs, "Peripheral", 0) end + boom = fn -> SysCallGlue.point(Stubs, "Peripheral", 0) end assert_raise FarmbotCore.Celery.RuntimeError, boom end @@ -33,7 +33,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do :whatever end) - boom = fn -> SysCalls.find_points_via_group(Stubs, :something_else) end + boom = fn -> SysCallGlue.find_points_via_group(Stubs, :something_else) end assert_raise FarmbotCore.Celery.RuntimeError, boom end @@ -43,7 +43,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do end) pg = %{point_ids: [1, 2, 3]} - result = SysCalls.find_points_via_group(Stubs, 456) + result = SysCallGlue.find_points_via_group(Stubs, 456) assert result == pg end @@ -52,7 +52,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do :ok end) - assert :ok = SysCalls.move_absolute(Stubs, 1, 2, 3, 4) + assert :ok = SysCallGlue.move_absolute(Stubs, 1, 2, 3, 4) end test "move_absolute, NO" do @@ -61,16 +61,16 @@ defmodule FarmbotCore.Celery.SysCallsTest do end) assert {:error, "move failed!"} == - SysCalls.move_absolute(Stubs, 1, 2, 3, 4) + SysCallGlue.move_absolute(Stubs, 1, 2, 3, 4) end test "get positions, OK" do expect(Stubs, :get_current_x, 1, fn -> 100.00 end) expect(Stubs, :get_current_y, 1, fn -> 200.00 end) expect(Stubs, :get_current_z, 1, fn -> 300.00 end) - assert 100.00 = SysCalls.get_current_x(Stubs) - assert 200.00 = SysCalls.get_current_y(Stubs) - assert 300.00 = SysCalls.get_current_z(Stubs) + assert 100.00 = SysCallGlue.get_current_x(Stubs) + assert 200.00 = SysCallGlue.get_current_y(Stubs) + assert 300.00 = SysCallGlue.get_current_z(Stubs) end test "get positions, KO" do @@ -78,9 +78,9 @@ defmodule FarmbotCore.Celery.SysCallsTest do expect(Stubs, :get_current_y, 1, fn -> {:error, "O"} end) expect(Stubs, :get_current_z, 1, fn -> {:error, "L"} end) - assert {:error, "L"} == SysCalls.get_current_x(Stubs) - assert {:error, "O"} == SysCalls.get_current_y(Stubs) - assert {:error, "L"} == SysCalls.get_current_z(Stubs) + assert {:error, "L"} == SysCallGlue.get_current_x(Stubs) + assert {:error, "O"} == SysCallGlue.get_current_y(Stubs) + assert {:error, "L"} == SysCallGlue.get_current_z(Stubs) end test "write_pin" do @@ -94,10 +94,10 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert :ok = SysCalls.write_pin(Stubs, 1, 0, 1) - assert :ok = SysCalls.write_pin(Stubs, %{type: "boxled", id: 4}, 0, 1) - assert :ok = SysCalls.write_pin(Stubs, %{type: "boxled", id: 3}, 1, 123) - assert err == SysCalls.write_pin(Stubs, 66, 0, 1) + assert :ok = SysCallGlue.write_pin(Stubs, 1, 0, 1) + assert :ok = SysCallGlue.write_pin(Stubs, %{type: "boxled", id: 4}, 0, 1) + assert :ok = SysCallGlue.write_pin(Stubs, %{type: "boxled", id: 3}, 1, 123) + assert err == SysCallGlue.write_pin(Stubs, 66, 0, 1) end test "read_pin" do @@ -109,9 +109,9 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert 20 == SysCalls.read_pin(Stubs, 10, 0) - assert 30 == SysCalls.read_pin(Stubs, 15, nil) - assert {:error, "firmware error"} == SysCalls.read_pin(Stubs, 1, 0) + assert 20 == SysCallGlue.read_pin(Stubs, 10, 0) + assert 30 == SysCallGlue.read_pin(Stubs, 15, nil) + assert {:error, "firmware error"} == SysCallGlue.read_pin(Stubs, 1, 0) end test "wait" do @@ -121,7 +121,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert :ok = SysCalls.wait(Stubs, 1000) + assert :ok = SysCallGlue.wait(Stubs, 1000) end test "named_pin" do @@ -140,18 +140,18 @@ defmodule FarmbotCore.Celery.SysCallsTest do end) # Peripheral and Sensor are on the Arduino - assert 44 == SysCalls.named_pin(Stubs, "Peripheral", 5) - assert 55 == SysCalls.named_pin(Stubs, "Sensor", 1999) + assert 44 == SysCallGlue.named_pin(Stubs, "Peripheral", 5) + assert 55 == SysCallGlue.named_pin(Stubs, "Sensor", 1999) # BoxLed is on the GPIO assert %{type: "BoxLed", id: 3} == - SysCalls.named_pin(Stubs, "BoxLed", 3) + SysCallGlue.named_pin(Stubs, "BoxLed", 3) assert %{type: "BoxLed", id: 4} == - SysCalls.named_pin(Stubs, "BoxLed", 4) + SysCallGlue.named_pin(Stubs, "BoxLed", 4) - assert err == SysCalls.named_pin(Stubs, "Peripheral", 888) + assert err == SysCallGlue.named_pin(Stubs, "Peripheral", 888) end test "send_message" do @@ -166,10 +166,10 @@ defmodule FarmbotCore.Celery.SysCallsTest do end) assert :ok = - SysCalls.send_message(Stubs, "success", "hello world", ["email"]) + SysCallGlue.send_message(Stubs, "success", "hello world", ["email"]) assert err == - SysCalls.send_message(Stubs, "error", "goodbye world", ["email"]) + SysCallGlue.send_message(Stubs, "error", "goodbye world", ["email"]) end test "find_home" do @@ -183,8 +183,8 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert :ok = SysCalls.find_home(Stubs, "x") - assert err == SysCalls.find_home(Stubs, "z") + assert :ok = SysCallGlue.find_home(Stubs, "x") + assert err == SysCallGlue.find_home(Stubs, "z") end test "execute_script" do @@ -198,8 +198,10 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert :ok = SysCalls.execute_script(Stubs, "take-photo", %{}) - assert err == SysCalls.execute_script(Stubs, "take-photo", %{error: true}) + assert :ok = SysCallGlue.execute_script(Stubs, "take-photo", %{}) + + assert err == + SysCallGlue.execute_script(Stubs, "take-photo", %{error: true}) end test "set_servo_angle errors" do @@ -213,8 +215,8 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert error == SysCalls.set_servo_angle(Stubs, 40, -5) - assert :ok == SysCalls.set_servo_angle(Stubs, 5, 40) + assert error == SysCallGlue.set_servo_angle(Stubs, 40, -5) + assert :ok == SysCallGlue.set_servo_angle(Stubs, 5, 40) end test "get_sequence" do @@ -234,7 +236,7 @@ defmodule FarmbotCore.Celery.SysCallsTest do end end) - assert nothing == SysCalls.get_sequence(Stubs, 123) - assert err == SysCalls.get_sequence(Stubs, 321) + assert nothing == SysCallGlue.get_sequence(Stubs, 123) + assert err == SysCallGlue.get_sequence(Stubs, 321) end end diff --git a/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs b/test/farmbot_celery_script/variable_transformer_test.exs similarity index 96% rename from farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs rename to test/farmbot_celery_script/variable_transformer_test.exs index e37b3202e..a46fc56cc 100644 --- a/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs +++ b/test/farmbot_celery_script/variable_transformer_test.exs @@ -3,7 +3,7 @@ defmodule FarmbotCore.Celery.VariableTransformerTest do use Mimic alias FarmbotCore.Celery.Compiler.VariableTransformer - alias FarmbotCore.Celery.SysCalls.Stubs + alias FarmbotCore.Celery.SysCallGlue.Stubs setup :verify_on_exit! diff --git a/farmbot_core/test/farmbot_celery_script_test.exs b/test/farmbot_celery_script_test.exs similarity index 98% rename from farmbot_core/test/farmbot_celery_script_test.exs rename to test/farmbot_celery_script_test.exs index 615c95bda..0b2b233ef 100644 --- a/farmbot_core/test/farmbot_celery_script_test.exs +++ b/test/farmbot_celery_script_test.exs @@ -3,7 +3,7 @@ defmodule FarmbotCore.CeleryTest do use Mimic alias FarmbotCore.Celery.AST - alias FarmbotCore.Celery.SysCalls.Stubs + alias FarmbotCore.Celery.SysCallGlue.Stubs import ExUnit.CaptureLog diff --git a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs b/test/farmbot_ext/api/dirty_worker_test.exs similarity index 91% rename from farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs rename to test/farmbot_ext/api/dirty_worker_test.exs index 0d5f45947..195f750a7 100644 --- a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs +++ b/test/farmbot_ext/api/dirty_worker_test.exs @@ -26,7 +26,10 @@ defmodule FarmbotExt.DirtyWorkerTest do test "child spec" do spec = DirtyWorker.child_spec(Point) assert spec[:id] == {DirtyWorker, Point} - assert spec[:start] == {DirtyWorker, :start_link, [[module: Point, timeout: 1000]]} + + assert spec[:start] == + {DirtyWorker, :start_link, [[module: Point, timeout: 1000]]} + assert spec[:type] == :worker assert spec[:restart] == :permanent assert spec[:shutdown] == 500 @@ -38,7 +41,7 @@ defmodule FarmbotExt.DirtyWorkerTest do Private.mark_stale!(p) assert Private.any_stale?() - expect(FarmbotCore.Celery.SysCalls, :sync, 1, fn -> + expect(FarmbotCore.Celery.SysCallGlue, :sync, 1, fn -> Private.mark_clean!(p) end) @@ -55,7 +58,7 @@ defmodule FarmbotExt.DirtyWorkerTest do |> FbosConfig.changeset() |> Repo.insert!() - expect(FarmbotCore.Celery.SysCalls, :sync, 1, fn -> + expect(FarmbotCore.Celery.SysCallGlue, :sync, 1, fn -> "I expect a 409 response to trigger a sync." end) @@ -70,7 +73,7 @@ defmodule FarmbotExt.DirtyWorkerTest do Helpers.delete_all_points() Repo.delete_all(LocalMeta) - stub(FarmbotCore.Celery.SysCalls, :sync, fn -> + stub(FarmbotCore.Celery.SysCallGlue, :sync, fn -> flunk("Never should call sync") end) diff --git a/farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs b/test/farmbot_ext/api/eager_loader_supervisor_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs rename to test/farmbot_ext/api/eager_loader_supervisor_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs b/test/farmbot_ext/api/eager_loader_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs rename to test/farmbot_ext/api/eager_loader_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/image_uploader_test.exs b/test/farmbot_ext/api/image_uploader_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/image_uploader_test.exs rename to test/farmbot_ext/api/image_uploader_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/ping_test.exs b/test/farmbot_ext/api/ping_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/ping_test.exs rename to test/farmbot_ext/api/ping_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/preloader_test.exs b/test/farmbot_ext/api/preloader_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/preloader_test.exs rename to test/farmbot_ext/api/preloader_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/reconciler_test.exs b/test/farmbot_ext/api/reconciler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/reconciler_test.exs rename to test/farmbot_ext/api/reconciler_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/sync_group_test.exs b/test/farmbot_ext/api/sync_group_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/sync_group_test.exs rename to test/farmbot_ext/api/sync_group_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api/view_test.exs b/test/farmbot_ext/api/view_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api/view_test.exs rename to test/farmbot_ext/api/view_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api_fetcher_test.exs b/test/farmbot_ext/api_fetcher_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api_fetcher_test.exs rename to test/farmbot_ext/api_fetcher_test.exs diff --git a/farmbot_ext/test/farmbot_ext/api_test.exs b/test/farmbot_ext/api_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/api_test.exs rename to test/farmbot_ext/api_test.exs diff --git a/farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs b/test/farmbot_ext/bootstrap/authorization_test.exs similarity index 77% rename from farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs rename to test/farmbot_ext/bootstrap/authorization_test.exs index cefcca0ae..f0b2042de 100644 --- a/farmbot_ext/test/farmbot_ext/bootstrap/authorization_test.exs +++ b/test/farmbot_ext/bootstrap/authorization_test.exs @@ -15,22 +15,26 @@ defmodule FarmbotExt.Bootstrap.AuthorizationTest do |> Base.encode64() {:ok, result} = Authorization.build_payload(fake_secret) - expected = "{\"user\":{\"credentials\":\"ZXlKcWRYTjBJam9pWVNCMFpYTjBJbjA9\"}}" + + expected = + "{\"user\":{\"credentials\":\"ZXlKcWRYTjBJam9pWVNCMFpYTjBJbjA9\"}}" + assert result == expected end test "build_secret/3" do email = "test@test.com" password = "password123" - pub_key = RSA.decode_key(Helpers.pub_key()) + pub_key = Authorization.rsa_decode_key(Helpers.pub_key()) cyphertext = Authorization.build_secret(email, password, pub_key) - priv_key = RSA.decode_key(Helpers.priv_key()) + priv_key = Authorization.rsa_decode_key(Helpers.priv_key()) %{ "email" => email_result, "password" => password_result, "version" => version - } = JSON.decode!(RSA.decrypt(cyphertext, {:private, priv_key})) + } = + JSON.decode!(Authorization.rsa_decrypt(cyphertext, {:private, priv_key})) assert email_result == email assert password_result == password @@ -43,7 +47,7 @@ defmodule FarmbotExt.Bootstrap.AuthorizationTest do request = {:get, url, "", headers} state = %{backoff: 5000, log_dispatch_flag: false} - expect(FarmbotTelemetry.HTTP, :request, 1, fn method, req, opt1, opt2 -> + expect(FarmbotOS.HTTP, :request, 1, fn method, req, opt1, opt2 -> assert method == :get assert req == {url, [{'Content-Type', 'application/json'}]} assert opt1 == [] diff --git a/farmbot_ext/test/farmbot_ext/bootstrap/drop_password_support_test.exs b/test/farmbot_ext/bootstrap/drop_password_support_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/bootstrap/drop_password_support_test.exs rename to test/farmbot_ext/bootstrap/drop_password_support_test.exs diff --git a/farmbot_ext/test/farmbot_ext/bootstrap/drop_password_task_test.exs b/test/farmbot_ext/bootstrap/drop_password_task_test.exs similarity index 89% rename from farmbot_ext/test/farmbot_ext/bootstrap/drop_password_task_test.exs rename to test/farmbot_ext/bootstrap/drop_password_task_test.exs index 9743260db..5af87e81a 100644 --- a/farmbot_ext/test/farmbot_ext/bootstrap/drop_password_task_test.exs +++ b/test/farmbot_ext/bootstrap/drop_password_task_test.exs @@ -16,7 +16,9 @@ defmodule FarmbotExt.Bootstrap.DropPasswordTaskTest do @fake_params %{email: "email", password: "password", server: "server"} test "drop_password" do - expect(Authorization, :authorize_with_password_v2, 1, fn _email, _pw, _server -> + expect(Authorization, :authorize_with_password_v2, 1, fn _email, + _pw, + _server -> {:ok, {[], "test_secret"}} end) diff --git a/farmbot_ext/test/farmbot_ext/bootstrap/supervisor_test.exs b/test/farmbot_ext/bootstrap/supervisor_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/bootstrap/supervisor_test.exs rename to test/farmbot_ext/bootstrap/supervisor_test.exs diff --git a/farmbot_ext/test/farmbot_ext/bootstrap_test.exs b/test/farmbot_ext/bootstrap_test.exs similarity index 77% rename from farmbot_ext/test/farmbot_ext/bootstrap_test.exs rename to test/farmbot_ext/bootstrap_test.exs index 3d62848c1..d9b9388d2 100644 --- a/farmbot_ext/test/farmbot_ext/bootstrap_test.exs +++ b/test/farmbot_ext/bootstrap_test.exs @@ -13,13 +13,16 @@ defmodule FarmbotExt.BootstrapTest do {:error, "Bad email or password."} end) - expect(FarmbotCore.Celery.SysCalls, :factory_reset, 1, fn "farmbot_os" -> :ok end) + expect(FarmbotCore.Celery.SysCallGlue, :factory_reset, 1, fn "farmbot_os" -> + :ok + end) run_test = fn -> assert Bootstrap.try_auth("", "", "", "") == {:noreply, nil, 0} end - expected_message = "[error] Password auth failed! Check again and reconfigurate." + expected_message = + "[error] Password auth failed! Check again and reconfigurate." assert capture_log(run_test) =~ expected_message end @@ -31,7 +34,9 @@ defmodule FarmbotExt.BootstrapTest do :string, "authorization", "secret" -> "the_secret" end) - expect(Authorization, :authorize_with_secret, 1, fn "the_email", "the_secret", "the_server" -> + expect(Authorization, :authorize_with_secret, 1, fn "the_email", + "the_secret", + "the_server" -> {:ok, "the_token"} end) diff --git a/farmbot_ext/test/farmbot_ext/jwt_test.exs b/test/farmbot_ext/jwt_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/jwt_test.exs rename to test/farmbot_ext/jwt_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/bot_state_handler_test.exs b/test/farmbot_ext/mqtt/bot_state_handler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/bot_state_handler_test.exs rename to test/farmbot_ext/mqtt/bot_state_handler_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/log_handler_support_test.exs b/test/farmbot_ext/mqtt/log_handler_support_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/log_handler_support_test.exs rename to test/farmbot_ext/mqtt/log_handler_support_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/log_handler_test.exs b/test/farmbot_ext/mqtt/log_handler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/log_handler_test.exs rename to test/farmbot_ext/mqtt/log_handler_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs b/test/farmbot_ext/mqtt/mqtt_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs rename to test/farmbot_ext/mqtt/mqtt_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/ping_handler_test.exs b/test/farmbot_ext/mqtt/ping_handler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/ping_handler_test.exs rename to test/farmbot_ext/mqtt/ping_handler_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/rpc_handler_test.exs b/test/farmbot_ext/mqtt/rpc_handler_test.exs similarity index 96% rename from farmbot_ext/test/farmbot_ext/mqtt/rpc_handler_test.exs rename to test/farmbot_ext/mqtt/rpc_handler_test.exs index 679f8a764..6d303d2c1 100644 --- a/farmbot_ext/test/farmbot_ext/mqtt/rpc_handler_test.exs +++ b/test/farmbot_ext/mqtt/rpc_handler_test.exs @@ -36,7 +36,8 @@ defmodule FarmbotExt.RPCHandlerTest do {:noreply, _next_state} = RPC.handle_info("SOMETHING ELSE", %{}) end - assert capture_log(misc) =~ "FarmbotExt.MQTT.RPCHandler Uncaught message: \"SOMETHING ELSE\"" + assert capture_log(misc) =~ + "FarmbotExt.MQTT.RPCHandler Uncaught message: \"SOMETHING ELSE\"" end test "handle_info({:inbound, [_, _, from_clients], payload}, state)" do diff --git a/farmbot_ext/test/farmbot_ext/mqtt/supervisor_test.exs b/test/farmbot_ext/mqtt/supervisor_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/supervisor_test.exs rename to test/farmbot_ext/mqtt/supervisor_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/support_test.exs b/test/farmbot_ext/mqtt/support_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/support_test.exs rename to test/farmbot_ext/mqtt/support_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs b/test/farmbot_ext/mqtt/sync_handler_support_test.exs similarity index 96% rename from farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs rename to test/farmbot_ext/mqtt/sync_handler_support_test.exs index 81ae5a0a0..7bef72972 100644 --- a/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs +++ b/test/farmbot_ext/mqtt/sync_handler_support_test.exs @@ -89,7 +89,8 @@ defmodule FarmbotExt.SyncHandlerSupportTest do _ -> raise "Wrong LED" end) - assert {:noreply, @fake_state} == Support.finalize_preload(@fake_state, "Something") + assert {:noreply, @fake_state} == + Support.finalize_preload(@fake_state, "Something") end test "reply_to_sync_message" do diff --git a/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_test.exs b/test/farmbot_ext/mqtt/sync_handler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/sync_handler_test.exs rename to test/farmbot_ext/mqtt/sync_handler_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/telemetry_handler_test.exs b/test/farmbot_ext/mqtt/telemetry_handler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/telemetry_handler_test.exs rename to test/farmbot_ext/mqtt/telemetry_handler_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/terminal_handler_support_test.exs b/test/farmbot_ext/mqtt/terminal_handler_support_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/terminal_handler_support_test.exs rename to test/farmbot_ext/mqtt/terminal_handler_support_test.exs diff --git a/farmbot_ext/test/farmbot_ext/mqtt/terminal_handler_test.exs b/test/farmbot_ext/mqtt/terminal_handler_test.exs similarity index 100% rename from farmbot_ext/test/farmbot_ext/mqtt/terminal_handler_test.exs rename to test/farmbot_ext/mqtt/terminal_handler_test.exs diff --git a/farmbot_os/test/farmbot_os/avrdude/avrdude_test.exs b/test/farmbot_os/avrdude/avrdude_test.exs similarity index 97% rename from farmbot_os/test/farmbot_os/avrdude/avrdude_test.exs rename to test/farmbot_os/avrdude/avrdude_test.exs index 2be8aa6a6..9c6bb5eb7 100644 --- a/farmbot_os/test/farmbot_os/avrdude/avrdude_test.exs +++ b/test/farmbot_os/avrdude/avrdude_test.exs @@ -1,6 +1,6 @@ defmodule FarmbotOs.AvrdudeTest do + alias FarmbotCore.Firmware.Avrdude use ExUnit.Case - use Mimic setup :verify_on_exit! diff --git a/farmbot_os/test/farmbot_os/configurator/config_data_layer_test.exs b/test/farmbot_os/configurator/config_data_layer_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/configurator/config_data_layer_test.exs rename to test/farmbot_os/configurator/config_data_layer_test.exs diff --git a/farmbot_os/test/farmbot_os/configurator/logger_socket_test.exs b/test/farmbot_os/configurator/logger_socket_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/configurator/logger_socket_test.exs rename to test/farmbot_os/configurator/logger_socket_test.exs diff --git a/farmbot_os/test/farmbot_os/configurator/router_test.exs b/test/farmbot_os/configurator/router_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/configurator/router_test.exs rename to test/farmbot_os/configurator/router_test.exs diff --git a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs b/test/farmbot_os/lua/ext/data_manipulation_test.exs similarity index 99% rename from farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs rename to test/farmbot_os/lua/ext/data_manipulation_test.exs index f79a758ec..951e87890 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs +++ b/test/farmbot_os/lua/ext/data_manipulation_test.exs @@ -307,7 +307,7 @@ defmodule FarmbotOS.Lua.DataManipulationTest do end test "http" do - expect(FarmbotTelemetry.HTTP, :hackney, 1, fn -> FakeHackney end) + expect(FarmbotOS.HTTP, :hackney, 1, fn -> FakeHackney end) params = FarmbotOS.Lua.Util.map_to_table(%{ diff --git a/farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs b/test/farmbot_os/lua/ext/firmware_test.exs similarity index 75% rename from farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs rename to test/farmbot_os/lua/ext/firmware_test.exs index e56fd9a13..0943bafd8 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs +++ b/test/farmbot_os/lua/ext/firmware_test.exs @@ -1,6 +1,6 @@ defmodule FarmbotOS.Lua.FirmwareTest do alias FarmbotOS.Lua.Firmware - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue use ExUnit.Case use Mimic setup :verify_on_exit! @@ -9,7 +9,7 @@ defmodule FarmbotOS.Lua.FirmwareTest do msg = "expected stub error" lua = "return" - expect(SysCalls, :calibrate, 2, fn + expect(SysCallGlue, :calibrate, 2, fn "x" -> :ok _ -> {:error, msg} end) @@ -22,7 +22,7 @@ defmodule FarmbotOS.Lua.FirmwareTest do msg = "expected stub error" lua = "return" - expect(SysCalls, :move_absolute, 4, fn + expect(SysCallGlue, :move_absolute, 4, fn 1, _, _, _ -> :ok _, _, _, _ -> {:error, msg} end) @@ -37,7 +37,7 @@ defmodule FarmbotOS.Lua.FirmwareTest do msg = "expected stub error" lua = "return" - expect(SysCalls, :find_home, 2, fn + expect(SysCallGlue, :find_home, 2, fn "x" -> :ok _ -> {:error, msg} end) @@ -50,10 +50,10 @@ defmodule FarmbotOS.Lua.FirmwareTest do msg = "expected stub error" lua = "return" - expect(SysCalls, :emergency_lock, 1, fn -> :ok end) + expect(SysCallGlue, :emergency_lock, 1, fn -> :ok end) assert {[true], ^lua} = Firmware.emergency_lock(:ok, lua) - expect(SysCalls, :emergency_lock, 1, fn -> + expect(SysCallGlue, :emergency_lock, 1, fn -> {:error, msg} end) @@ -64,10 +64,10 @@ defmodule FarmbotOS.Lua.FirmwareTest do msg = "expected stub error" lua = "return" - expect(SysCalls, :emergency_unlock, 1, fn -> :ok end) + expect(SysCallGlue, :emergency_unlock, 1, fn -> :ok end) assert {[true], ^lua} = Firmware.emergency_unlock(:ok, lua) - expect(SysCalls, :emergency_unlock, 1, fn -> + expect(SysCallGlue, :emergency_unlock, 1, fn -> {:error, msg} end) @@ -75,11 +75,11 @@ defmodule FarmbotOS.Lua.FirmwareTest do end test "home" do - expect(SysCalls, :get_current_x, 2, fn -> 1.0 end) - expect(SysCalls, :get_current_y, 2, fn -> 2.0 end) - expect(SysCalls, :get_current_z, 2, fn -> 3.0 end) + expect(SysCallGlue, :get_current_x, 2, fn -> 1.0 end) + expect(SysCallGlue, :get_current_y, 2, fn -> 2.0 end) + expect(SysCallGlue, :get_current_z, 2, fn -> 3.0 end) - expect(SysCalls, :move_absolute, 2, fn + expect(SysCallGlue, :move_absolute, 2, fn 0, 2.0, 3.0, 100 -> :ok 1.0, 0, 3.0, 100 -> {:error, "expected stub error"} end) diff --git a/farmbot_os/test/farmbot_os/lua/ext/info_test.exs b/test/farmbot_os/lua/ext/info_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/lua/ext/info_test.exs rename to test/farmbot_os/lua/ext/info_test.exs diff --git a/farmbot_os/test/farmbot_os/lua/ext/wait_test.exs b/test/farmbot_os/lua/ext/wait_test.exs similarity index 75% rename from farmbot_os/test/farmbot_os/lua/ext/wait_test.exs rename to test/farmbot_os/lua/ext/wait_test.exs index 2367e60c9..5ab186976 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/wait_test.exs +++ b/test/farmbot_os/lua/ext/wait_test.exs @@ -1,6 +1,6 @@ defmodule FarmbotOS.Lua.WaitTest do alias FarmbotOS.Lua.Wait - alias FarmbotCore.Celery.SysCalls + alias FarmbotCore.Celery.SysCallGlue use ExUnit.Case use Mimic @@ -9,9 +9,9 @@ defmodule FarmbotOS.Lua.WaitTest do test "wait/2 - illegal value" do err_msg = "Do not use sleep for longer than three minutes." - expect(SysCalls, :emergency_lock, 1, fn -> :ok end) + expect(SysCallGlue, :emergency_lock, 1, fn -> :ok end) - expect(SysCalls, :send_message, 1, fn kind, msg, chans -> + expect(SysCallGlue, :send_message, 1, fn kind, msg, chans -> assert kind == "error" assert msg == err_msg assert chans == ["toast"] diff --git a/farmbot_os/test/farmbot_os/lua/util_test.exs b/test/farmbot_os/lua/util_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/lua/util_test.exs rename to test/farmbot_os/lua/util_test.exs diff --git a/farmbot_os/test/farmbot_os/lua_test.exs b/test/farmbot_os/lua_test.exs similarity index 93% rename from farmbot_os/test/farmbot_os/lua_test.exs rename to test/farmbot_os/lua_test.exs index 282393a08..83ecaea80 100644 --- a/farmbot_os/test/farmbot_os/lua_test.exs +++ b/test/farmbot_os/lua_test.exs @@ -90,7 +90,7 @@ defmodule FarmbotOS.LuaTest do {[], lua} end) - expect(Command, :move_abs, 1, fn _ -> {:ok, nil} end) + # expect(Command, :move_abs, 1, fn _ -> {:ok, nil} end) expect(Command, :read_pin, 1, fn _, _ -> {:ok, 1} end) expect(Firmware, :move_absolute, 4, fn _vec_or_xyz, lua -> @@ -130,10 +130,15 @@ defmodule FarmbotOS.LuaTest do end) Enum.map(@documentation_examples, fn lua -> - result = - FarmbotCore.Celery.Compiler.Lua.do_lua(lua, %{ - declarations: %{"parent" => %{"x" => 1000}} - }) + scope = %FarmbotCore.Celery.Compiler.Scope{ + declarations: %{ + "parent" => %{"x" => 1000} + }, + parent: nil + } + + extra_vm_args = FarmbotCore.Celery.Compiler.Lua.scope_to_lua(scope) + result = FarmbotOS.Lua.perform_lua(lua, extra_vm_args, lua) case result do {:ok, _} -> diff --git a/farmbot_os/test/farmbot_os/sys_calls_test.exs b/test/farmbot_os/sys_calls_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/sys_calls_test.exs rename to test/farmbot_os/sys_calls_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/change_ownership_test.exs b/test/farmbot_os/syscalls/change_ownership_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/change_ownership_test.exs rename to test/farmbot_os/syscalls/change_ownership_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/check_update_test.exs b/test/farmbot_os/syscalls/check_update_test.exs similarity index 97% rename from farmbot_os/test/farmbot_os/syscalls/check_update_test.exs rename to test/farmbot_os/syscalls/check_update_test.exs index 7fefa81fe..8beb364f1 100644 --- a/farmbot_os/test/farmbot_os/syscalls/check_update_test.exs +++ b/test/farmbot_os/syscalls/check_update_test.exs @@ -52,7 +52,7 @@ defmodule FarmbotOS.SysCalls.CheckUpdateTest do :ok end) - expect(FarmbotCore.Celery.SysCalls, :reboot, 1, fn -> + expect(FarmbotCore.Celery.SysCallGlue, :reboot, 1, fn -> :ok end) diff --git a/farmbot_os/test/farmbot_os/syscalls/farmware_test.exs b/test/farmbot_os/syscalls/farmware_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/farmware_test.exs rename to test/farmbot_os/syscalls/farmware_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/movement_test.exs b/test/farmbot_os/syscalls/movement_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/movement_test.exs rename to test/farmbot_os/syscalls/movement_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/pin_control_test.exs b/test/farmbot_os/syscalls/pin_control_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/pin_control_test.exs rename to test/farmbot_os/syscalls/pin_control_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/point_lookup_test.exs b/test/farmbot_os/syscalls/point_lookup_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/point_lookup_test.exs rename to test/farmbot_os/syscalls/point_lookup_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/resource_update_test.exs b/test/farmbot_os/syscalls/resource_update_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/resource_update_test.exs rename to test/farmbot_os/syscalls/resource_update_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/send_message_test.exs b/test/farmbot_os/syscalls/send_message_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/send_message_test.exs rename to test/farmbot_os/syscalls/send_message_test.exs diff --git a/farmbot_os/test/farmbot_os/syscalls/set_pin_io_mode_test.exs b/test/farmbot_os/syscalls/set_pin_io_mode_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/syscalls/set_pin_io_mode_test.exs rename to test/farmbot_os/syscalls/set_pin_io_mode_test.exs diff --git a/farmbot_os/test/farmbot_os/system_test.exs b/test/farmbot_os/system_test.exs similarity index 71% rename from farmbot_os/test/farmbot_os/system_test.exs rename to test/farmbot_os/system_test.exs index 013f8908b..070aca34c 100644 --- a/farmbot_os/test/farmbot_os/system_test.exs +++ b/test/farmbot_os/system_test.exs @@ -5,7 +5,7 @@ defmodule FarmbotOS.SystemTest do alias FarmbotOS.System alias FarmbotCore.Firmware.Command - import ExUnit.CaptureLog + require Helpers setup :verify_on_exit! test "try_lock_fw - OK" do @@ -14,8 +14,8 @@ defmodule FarmbotOS.SystemTest do end test "try_lock_fw - NO" do + Helpers.expect_log("Emergency lock failed. Powering down") expect(Command, :lock, 1, fn -> raise "BOOM" end) - boom = fn -> System.try_lock_fw() end - assert capture_log(boom) =~ "Emergency lock failed. Powering down" + System.try_lock_fw() end end diff --git a/farmbot_os/test/farmbot_os/update_support_test.exs b/test/farmbot_os/update_support_test.exs similarity index 100% rename from farmbot_os/test/farmbot_os/update_support_test.exs rename to test/farmbot_os/update_support_test.exs diff --git a/farmbot_telemetry/test/farmbot_telemetry_test.exs b/test/farmbot_telemetry_test.exs similarity index 90% rename from farmbot_telemetry/test/farmbot_telemetry_test.exs rename to test/farmbot_telemetry_test.exs index d6485df9e..7b7368f28 100644 --- a/farmbot_telemetry/test/farmbot_telemetry_test.exs +++ b/test/farmbot_telemetry_test.exs @@ -1,14 +1,13 @@ defmodule FarmbotTelemetryTest do use ExUnit.Case doctest FarmbotTelemetry - require FarmbotTelemetry test "uses :telemetry" do :ok = FarmbotTelemetry.attach_recv(:event, :test_subsystem, self()) :ok = FarmbotTelemetry.event(:test_subsystem, :measurement, 1.0) - assert_receive {[:farmbot_telemetry, :event, :test_subsystem], + assert_receive {[:farmbot, :event, :test_subsystem], %{measurement: :measurement, value: 1.0}, _meta, _config} end @@ -18,7 +17,7 @@ defmodule FarmbotTelemetryTest do :ok = FarmbotTelemetry.event(:test_subsystem, :measurement, 1.0, hello: "world") - assert_receive {[:farmbot_telemetry, :event, :test_subsystem], + assert_receive {[:farmbot, :event, :test_subsystem], %{measurement: :measurement, value: 1.0}, meta, _config} assert meta[:hello] == "world" diff --git a/farmbot_core/test/farmware_runtime/pipe_worker_test.exs b/test/farmware_runtime/pipe_worker_test.exs similarity index 100% rename from farmbot_core/test/farmware_runtime/pipe_worker_test.exs rename to test/farmware_runtime/pipe_worker_test.exs diff --git a/farmbot_core/test/farmware_runtime_test.exs b/test/farmware_runtime_test.exs similarity index 100% rename from farmbot_core/test/farmware_runtime_test.exs rename to test/farmware_runtime_test.exs diff --git a/farmbot_os/test/filesystem_test.exs b/test/filesystem_test.exs similarity index 100% rename from farmbot_os/test/filesystem_test.exs rename to test/filesystem_test.exs diff --git a/farmbot_core/test/firmware/command_test.exs b/test/firmware/command_test.exs similarity index 100% rename from farmbot_core/test/firmware/command_test.exs rename to test/firmware/command_test.exs diff --git a/farmbot_core/test/firmware/config_uploader_test.exs b/test/firmware/config_uploader_test.exs similarity index 74% rename from farmbot_core/test/firmware/config_uploader_test.exs rename to test/firmware/config_uploader_test.exs index 8855e5103..0b72d3fc2 100644 --- a/farmbot_core/test/firmware/config_uploader_test.exs +++ b/test/firmware/config_uploader_test.exs @@ -2,7 +2,7 @@ defmodule FarmbotCore.Firmware.ConfigUploaderTest do use ExUnit.Case use Mimic - import ExUnit.CaptureLog + require Helpers alias FarmbotCore.Firmware.{ ConfigUploader, @@ -31,16 +31,15 @@ defmodule FarmbotCore.Firmware.ConfigUploaderTest do ] } - t = fn -> - result = ConfigUploader.refresh(@state, @new_keys) - assert result.tx_buffer == expected - end + Helpers.expect_log( + "Updating firmware parameters: [:movement_stop_at_home_z]" + ) expect(FarmbotCore.Asset, :firmware_config, 1, fn -> %{movement_stop_at_home_z: 1.23} end) - assert capture_log(t) =~ - "Updating firmware parameters: [:movement_stop_at_home_z]" + result = ConfigUploader.refresh(@state, @new_keys) + assert result.tx_buffer == expected end end diff --git a/farmbot_core/test/firmware/error_detector_test.exs b/test/firmware/error_detector_test.exs similarity index 100% rename from farmbot_core/test/firmware/error_detector_test.exs rename to test/firmware/error_detector_test.exs diff --git a/farmbot_core/test/firmware/estop_timer.exs b/test/firmware/estop_timer.exs similarity index 100% rename from farmbot_core/test/firmware/estop_timer.exs rename to test/firmware/estop_timer.exs diff --git a/farmbot_core/test/firmware/flash_test.exs b/test/firmware/flash_test.exs similarity index 100% rename from farmbot_core/test/firmware/flash_test.exs rename to test/firmware/flash_test.exs diff --git a/farmbot_core/test/firmware/flash_utils_test.exs b/test/firmware/flash_utils_test.exs similarity index 100% rename from farmbot_core/test/firmware/flash_utils_test.exs rename to test/firmware/flash_utils_test.exs diff --git a/farmbot_core/test/firmware/floating_point_test.exs b/test/firmware/floating_point_test.exs similarity index 100% rename from farmbot_core/test/firmware/floating_point_test.exs rename to test/firmware/floating_point_test.exs diff --git a/farmbot_core/test/firmware/gcode_decoder_test.exs b/test/firmware/gcode_decoder_test.exs similarity index 89% rename from farmbot_core/test/firmware/gcode_decoder_test.exs rename to test/firmware/gcode_decoder_test.exs index f506103e7..3c5535d43 100644 --- a/farmbot_core/test/firmware/gcode_decoder_test.exs +++ b/test/firmware/gcode_decoder_test.exs @@ -44,12 +44,6 @@ defmodule FarmbotCore.Firmware.GCodeDecoderTest do assert expected == GCodeDecoder.run(@fake_txt) end - test "unexpected input" do - boom = fn -> GCodeDecoder.run(["F21"]) end - msg = "Expect inbound GCode to begin with `R`. Got: \"F21\"" - assert_raise RuntimeError, msg, boom - end - test "negative numbers" do expected = [ encoder_position_scaled: %{queue: 0.0, x: 0.2, y: 0.2, z: -123.4} diff --git a/farmbot_core/test/firmware/gcode_test.exs b/test/firmware/gcode_test.exs similarity index 100% rename from farmbot_core/test/firmware/gcode_test.exs rename to test/firmware/gcode_test.exs diff --git a/farmbot_core/test/firmware/inbound_side_effects_test.exs b/test/firmware/inbound_side_effects_test.exs similarity index 91% rename from farmbot_core/test/firmware/inbound_side_effects_test.exs rename to test/firmware/inbound_side_effects_test.exs index 9fbc62f0b..0b8cc0034 100644 --- a/farmbot_core/test/firmware/inbound_side_effects_test.exs +++ b/test/firmware/inbound_side_effects_test.exs @@ -7,6 +7,8 @@ defmodule FarmbotCore.Firmware.InboundSideEffectsTest do alias FarmbotCore.Firmware.InboundSideEffects alias FarmbotCore.Asset + require Helpers + @fake_state %FarmbotCore.Firmware.UARTCore{} @relevant_keys [ :logs_enabled, @@ -37,8 +39,8 @@ defmodule FarmbotCore.Firmware.InboundSideEffectsTest do end test "unknown messages" do - t = fn -> simple_case([{:bleh, %{}}]) end - assert capture_log(t) =~ "Unhandled inbound side effects: {:bleh, %{}}" + Helpers.expect_log("Unhandled inbound side effects: {:bleh, %{}}") + simple_case([{:bleh, %{}}]) end test ":motor_load_report" do @@ -55,8 +57,8 @@ defmodule FarmbotCore.Firmware.InboundSideEffectsTest do end test ":movement_retry" do - t = fn -> simple_case([{:movement_retry, %{}}]) end - assert capture_log(t) =~ "Retrying movement" + Helpers.expect_log("Retrying movement") + simple_case([{:movement_retry, %{}}]) end test ":not_configured" do @@ -103,14 +105,15 @@ defmodule FarmbotCore.Firmware.InboundSideEffectsTest do y = fn -> simple_case([{:different_y_coordinate_than_given, %{y: 3.4}}]) end z = fn -> simple_case([{:different_z_coordinate_than_given, %{z: 5.6}}]) end - assert capture_log(x) =~ - "Stopping at X home instead of specified destination." - - assert capture_log(y) =~ - "Stopping at Y max instead of specified destination." + Helpers.expect_logs([ + "Stopping at X home instead of specified destination.", + "Stopping at Y max instead of specified destination.", + "Stopping at Z max instead of specified destination." + ]) - assert capture_log(z) =~ - "Stopping at Z max instead of specified destination." + capture_log(x) + capture_log(y) + capture_log(z) end test ":pin_value_report" do @@ -207,15 +210,15 @@ defmodule FarmbotCore.Firmware.InboundSideEffectsTest do test "Firmware debug logs" do msg = "Hello, world!" gcode = [{:debug_message, msg}] - run = fn -> InboundSideEffects.process(@fake_state, gcode) end - assert capture_log(run) =~ msg + t = fn -> InboundSideEffects.process(@fake_state, gcode) end + assert capture_log(t) =~ msg end test "Debug logging enabled" do s = %{@fake_state | logs_enabled: true} gcode = {:complete_homing_x, nil} - run = fn -> InboundSideEffects.process(s, [gcode]) end - assert capture_log(run) =~ inspect(gcode) + t = fn -> InboundSideEffects.process(s, [gcode]) end + assert capture_log(t) =~ inspect(gcode) end test "complete_homing_x|y|z" do diff --git a/farmbot_core/test/firmware/lua_uart_test.exs b/test/firmware/lua_uart_test.exs similarity index 100% rename from farmbot_core/test/firmware/lua_uart_test.exs rename to test/firmware/lua_uart_test.exs diff --git a/farmbot_core/test/firmware/parameter_test.exs b/test/firmware/parameter_test.exs similarity index 100% rename from farmbot_core/test/firmware/parameter_test.exs rename to test/firmware/parameter_test.exs diff --git a/farmbot_core/test/firmware/resetter_test.exs b/test/firmware/resetter_test.exs similarity index 54% rename from farmbot_core/test/firmware/resetter_test.exs rename to test/firmware/resetter_test.exs index 63b021ec2..6848406e4 100644 --- a/farmbot_core/test/firmware/resetter_test.exs +++ b/test/firmware/resetter_test.exs @@ -2,7 +2,7 @@ defmodule FarmbotCore.Firmware.ResetterTest do require Helpers use ExUnit.Case use Mimic - import ExUnit.CaptureLog + alias FarmbotCore.Firmware.Resetter setup :verify_on_exit! @@ -20,15 +20,11 @@ defmodule FarmbotCore.Firmware.ResetterTest do end test "run_special_reset" do - t = fn -> :ok == Resetter.run_special_reset(GpioResetMock) end - assert capture_log(t) =~ "Finish MCU Reset" - end + Helpers.expect_logs([ + "Begin MCU reset", + "Finish MCU Reset" + ]) - # Legacy code; Too complicated to test. Focusing on easier - # tests for now. - # test "express_k10 in non-express environments" do - # Helpers.expect_log("Using special express reset function") - # {:ok, noop} = Resetter.find_reset_fun("express_k10") - # assert :ok == noop.() - # end + assert :ok == Resetter.run_special_reset(GpioResetMock) + end end diff --git a/farmbot_core/test/firmware/rx_buffer_test.exs b/test/firmware/rx_buffer_test.exs similarity index 100% rename from farmbot_core/test/firmware/rx_buffer_test.exs rename to test/firmware/rx_buffer_test.exs diff --git a/farmbot_core/test/firmware/tx_buffer_test.exs b/test/firmware/tx_buffer_test.exs similarity index 100% rename from farmbot_core/test/firmware/tx_buffer_test.exs rename to test/firmware/tx_buffer_test.exs diff --git a/farmbot_core/test/firmware/uart_core_support_test.exs b/test/firmware/uart_core_support_test.exs similarity index 100% rename from farmbot_core/test/firmware/uart_core_support_test.exs rename to test/firmware/uart_core_support_test.exs diff --git a/farmbot_core/test/firmware/uart_core_test.exs b/test/firmware/uart_core_test.exs similarity index 86% rename from farmbot_core/test/firmware/uart_core_test.exs rename to test/firmware/uart_core_test.exs index 96af80220..53ffba01d 100644 --- a/farmbot_core/test/firmware/uart_core_test.exs +++ b/test/firmware/uart_core_test.exs @@ -9,11 +9,13 @@ defmodule FarmbotCore.Firmware.UARTCoreTest do alias FarmbotCore.Firmware.ConfigUploader alias FarmbotCore.BotState + require Helpers + setup :set_mimic_global setup :verify_on_exit! - @path "ttyACM0" test ":best_effort_bug_fix - KO" do + Helpers.expect_log("Rebooting inactive Farmduino.") state1 = %UARTCore{fw_type: nil} expect(BotState, :fetch, 1, fn -> @@ -24,28 +26,23 @@ defmodule FarmbotCore.Firmware.UARTCoreTest do %{firmware_hardware: "none"} end) - t = fn -> - {:noreply, state2} = UARTCore.handle_info(:best_effort_bug_fix, state1) - assert state2 == state1 - end + {:noreply, state2} = UARTCore.handle_info(:best_effort_bug_fix, state1) + assert state2 == state1 - assert capture_log(t) =~ "Rebooting inactive Farmduino." assert_receive {:"$gen_call", _, {:flash_firmware, "none"}} end test ":best_effort_bug_fix - OK" do + Helpers.expect_log("Farmduino OK") + state1 = %UARTCore{rx_count: 100} expect(BotState, :fetch, 1, fn -> %{informational_settings: %{firmware_version: "1.1.1"}} end) - t = fn -> - {:noreply, state2} = UARTCore.handle_info(:best_effort_bug_fix, state1) - assert state2 == state1 - end - - assert capture_log(t) =~ "Farmduino OK" + {:noreply, state2} = UARTCore.handle_info(:best_effort_bug_fix, state1) + assert state2 == state1 end test ":reset_state" do @@ -126,15 +123,12 @@ defmodule FarmbotCore.Firmware.UARTCoreTest do end test "flash_firmware (nil)" do - t = fn -> - {:reply, :ok, state} = - UARTCore.handle_call({:flash_firmware, nil}, nil, %UARTCore{}) + Helpers.expect_log("Can't flash firmware yet because hardware is unknown.") - assert state == %UARTCore{} - end + {:reply, :ok, state} = + UARTCore.handle_call({:flash_firmware, nil}, nil, %UARTCore{}) - assert capture_log(t) =~ - "Can't flash firmware yet because hardware is unknown." + assert state == %UARTCore{} end test "start_job" do diff --git a/farmbot_core/test/firmware/uart_observer_test.exs b/test/firmware/uart_observer_test.exs similarity index 100% rename from farmbot_core/test/firmware/uart_observer_test.exs rename to test/firmware/uart_observer_test.exs diff --git a/farmbot_core/test/fixtures/execute.json b/test/fixtures/execute.json similarity index 100% rename from farmbot_core/test/fixtures/execute.json rename to test/fixtures/execute.json diff --git a/farmbot_core/test/fixtures/mark_variable_meta.json b/test/fixtures/mark_variable_meta.json similarity index 100% rename from farmbot_core/test/fixtures/mark_variable_meta.json rename to test/fixtures/mark_variable_meta.json diff --git a/farmbot_core/test/fixtures/mark_variable_removed.json b/test/fixtures/mark_variable_removed.json similarity index 100% rename from farmbot_core/test/fixtures/mark_variable_removed.json rename to test/fixtures/mark_variable_removed.json diff --git a/farmbot_core/test/fixtures/set_mounted_tool_id.json b/test/fixtures/set_mounted_tool_id.json similarity index 100% rename from farmbot_core/test/fixtures/set_mounted_tool_id.json rename to test/fixtures/set_mounted_tool_id.json diff --git a/farmbot_core/test/fixtures/update_resource_multi.json b/test/fixtures/update_resource_multi.json similarity index 100% rename from farmbot_core/test/fixtures/update_resource_multi.json rename to test/fixtures/update_resource_multi.json diff --git a/farmbot_telemetry/test/http_test.exs b/test/http_test.exs similarity index 57% rename from farmbot_telemetry/test/http_test.exs rename to test/http_test.exs index 5f951149b..7d09dd4a2 100644 --- a/farmbot_telemetry/test/http_test.exs +++ b/test/http_test.exs @@ -1,9 +1,10 @@ -defmodule FarmbotTelemetry.HTTPTest do +defmodule FarmbotOS.HTTPTest do use ExUnit.Case - doctest FarmbotTelemetry.HTTP + doctest FarmbotOS.HTTP + alias FarmbotOS.HTTP def get(url) do - FarmbotTelemetry.HTTP.request(:get, {to_charlist(url), []}, [], []) + FarmbotOS.HTTP.request(:get, {to_charlist(url), []}, [], []) end @bad_urls [ @@ -12,10 +13,15 @@ defmodule FarmbotTelemetry.HTTPTest do "https://self-signed.badssl.com/" ] - test "request/4" do + test "request/4 - SSL stuff" do case get("https://badssl.com") do {:ok, _} -> Enum.map(@bad_urls, fn url -> {:error, _} = get(url) end) _ -> IO.warn("Can't reach https://badssl.com; Not testing SSL parts.") end end + + test "request/4" do + params = {'http://typo.farm.bot', []} + assert {:error, _error} = HTTP.request(:head, params, [], []) + end end diff --git a/farmbot_core/test/interpolation_test.exs b/test/interpolation_test.exs similarity index 100% rename from farmbot_core/test/interpolation_test.exs rename to test/interpolation_test.exs diff --git a/farmbot_core/test/leds/stub_handler_test.exs b/test/leds/stub_handler_test.exs similarity index 100% rename from farmbot_core/test/leds/stub_handler_test.exs rename to test/leds/stub_handler_test.exs diff --git a/farmbot_core/test/log_test.exs b/test/log_test.exs similarity index 100% rename from farmbot_core/test/log_test.exs rename to test/log_test.exs diff --git a/farmbot_core/test/logger_test.exs b/test/logger_test.exs similarity index 58% rename from farmbot_core/test/logger_test.exs rename to test/logger_test.exs index 119f821c2..a7df5d6d6 100644 --- a/farmbot_core/test/logger_test.exs +++ b/test/logger_test.exs @@ -1,13 +1,14 @@ defmodule FarmbotCore.LoggerTest do use ExUnit.Case - require FarmbotCore.Logger - - alias FarmbotCore.{Log, Logger.Repo} - + alias FarmbotCore.{Log, Asset.Repo} import Ecto.Query import ExUnit.CaptureLog + require FarmbotCore.Logger + + def create_log(msg) do + FarmbotCore.Logger.debug(1, msg) + end - def create_log(msg), do: FarmbotCore.Logger.debug(1, msg) def clear_logs(), do: Repo.delete_all(Log) def log_count(), do: Repo.one(from(l in "logs", select: count(l.id))) @@ -46,45 +47,8 @@ defmodule FarmbotCore.LoggerTest do ) end - # @fake_msg %Log{ - # message: "Hello, world!", - # verbosity: 3, - # level: :info, - # updated_at: ~U[1998-11-07 16:52:31.618000Z] - # } - test "insert_log!/1 - unknown format" do t = fn -> FarmbotCore.Logger.insert_log!(%{foo: :bar}) end assert capture_log(t) =~ "Can't decode log: %{foo: :bar}" end - - # test "insert_log!/1 - pass in a %Log{}" do - # result1 = FarmbotCore.Logger.insert_log!(@fake_msg) - - # expected1 = %Log{ - # duplicates: 0, - # env: "test", - # message: "Hello, world!", - # target: "host" - # } - - # assert result1.duplicates == expected1.duplicates - # assert result1.env == expected1.env - # assert result1.message == expected1.message - # assert result1.target == expected1.target - - # result2 = FarmbotCore.Logger.insert_log!(@fake_msg) - - # expected2 = %Log{ - # duplicates: 1, - # env: "test", - # message: "Hello, world!", - # target: "host" - # } - - # assert result2.duplicates == expected2.duplicates - # assert result2.env == expected2.env - # assert result2.message == expected2.message - # assert result2.target == expected2.target - # end end diff --git a/farmbot_core/test/stub_test.exs b/test/stub_test.exs similarity index 96% rename from farmbot_core/test/stub_test.exs rename to test/stub_test.exs index f05f9c121..ff91ff890 100644 --- a/farmbot_core/test/stub_test.exs +++ b/test/stub_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCore.Celery.SysCalls.StubsTest do +defmodule FarmbotCore.Celery.SysCallGlue.StubsTest do use ExUnit.Case - alias FarmbotCore.Celery.SysCalls.Stubs + alias FarmbotCore.Celery.SysCallGlue.Stubs test "various stubs" do # This test is to: diff --git a/test/support/test_support.ex b/test/test_helper.exs similarity index 52% rename from test/support/test_support.ex rename to test/test_helper.exs index fea94497d..f709e2d6c 100644 --- a/test/support/test_support.ex +++ b/test/test_helper.exs @@ -1,3 +1,6 @@ +Application.ensure_all_started(:mimic) +Application.ensure_all_started(:farmbot) + defmodule Helpers do alias FarmbotCore.Asset.{Repo, Point} @@ -84,7 +87,17 @@ defmodule Helpers do defmacro expect_log(msg) do quote do expect(FarmbotCore.LogExecutor, :execute, 1, fn log -> - assert log.message == unquote(msg) + assert log.message =~ unquote(msg) + end) + end + end + + defmacro expect_logs(strings) do + log_count = Enum.count(strings) + + quote do + expect(FarmbotCore.LogExecutor, :execute, unquote(log_count), fn log -> + assert Enum.member?(unquote(strings), log.message) end) end end @@ -134,3 +147,221 @@ defmodule Helpers do |> Repo.insert!() end end + +# Use this to stub out calls to `state.reset.reset()` in firmware. +defmodule StubReset do + def reset(), do: :ok +end + +defmodule NoOp do + use GenServer + + def new(opts \\ []) do + {:ok, pid} = start_link(opts) + pid + end + + def stop(pid) do + _ = Process.unlink(pid) + :ok = GenServer.stop(pid, :normal, 3_000) + end + + def last_message(pid) do + :sys.get_state(pid) + end + + def start_link(opts) do + GenServer.start_link(__MODULE__, [], opts) + end + + def init([]) do + {:ok, :no_message_yet} + end + + def handle_info(next_message, _last_message) do + {:noreply, next_message} + end +end + +defmodule SimpleCounter do + def new(starting_value \\ 0) do + Agent.start_link(fn -> starting_value end) + end + + def get_count(pid) do + Agent.get(pid, fn count -> count end) + end + + def incr(pid, by \\ 1) do + Agent.update(pid, fn count -> count + by end) + pid + end + + # Increment the counter by one and get the current count. + def bump(pid, by \\ 1) do + pid |> incr(by) |> get_count() + end +end + +defmodule Farmbot.TestSupport.AssetFixtures do + alias FarmbotCore.Asset.{ + Device, + FarmEvent, + Regimen, + RegimenInstance, + Repo, + Sequence + } + + def regimen_instance(regimen_params, farm_event_params, params \\ %{}) do + regimen = regimen(regimen_params) + farm_event = regimen_event(regimen, farm_event_params) + params = Map.merge(%{id: :rand.uniform(10000), monitor: false}, params) + + RegimenInstance.changeset(%RegimenInstance{}, params) + |> Ecto.Changeset.put_assoc(:regimen, regimen) + |> Ecto.Changeset.put_assoc(:farm_event, farm_event) + |> Repo.insert!() + end + + def sequence(params \\ %{}) do + default = %{ + id: :rand.uniform(10000), + monitor: false, + kind: "sequence", + args: %{locals: %{kind: "scope_declaration", args: %{}}}, + body: [] + } + + Sequence + |> struct() + |> Sequence.changeset(Map.merge(default, params)) + |> Repo.insert!() + end + + def regimen(params \\ %{}) do + default = %{id: :rand.uniform(10000), monitor: false, regimen_items: []} + + Regimen + |> struct() + |> Regimen.changeset(Map.merge(default, params)) + |> Repo.insert!() + end + + def regimen_event(regimen, params \\ %{}) do + now = DateTime.utc_now() + + params = + Map.merge( + %{ + id: :rand.uniform(1_000_000), + monitor: false, + executable_type: "Regimen", + executable_id: regimen.id, + start_time: now, + end_time: now, + repeat: 0, + time_unit: "never" + }, + params + ) + + FarmEvent + |> struct() + |> FarmEvent.changeset(params) + |> Repo.insert!() + end + + @doc """ + Instantiates, but does not create, a %Device{} + """ + def device_init(params \\ %{}) do + defaults = %{id: :rand.uniform(1_000_000), monitor: false} + params = Map.merge(defaults, params) + + Device + |> struct() + |> Device.changeset(params) + |> Ecto.Changeset.apply_changes() + end +end + +timeout = System.get_env("EXUNIT_TIMEOUT") || "5000" +System.put_env("LOG_SILENCE", "true") + +ExUnit.configure( + max_cases: 1, + assert_receive_timeout: String.to_integer(timeout) +) + +[ + Circuits.UART, + Ecto.Changeset, + ExTTY, + FarmbotCore.Asset, + FarmbotCore.Asset.Command, + FarmbotCore.Asset.Device, + FarmbotCore.Asset.FbosConfig, + FarmbotCore.Asset.FirmwareConfig, + FarmbotCore.Asset.Private, + FarmbotCore.Asset.Repo, + FarmbotCore.BotState, + FarmbotCore.Celery, + FarmbotCore.Celery.Compiler.Lua, + FarmbotCore.Celery.Scheduler, + FarmbotCore.Celery.SpecialValue, + FarmbotCore.Celery.SysCallGlue, + FarmbotCore.Celery.SysCallGlue.Stubs, + FarmbotCore.Config, + FarmbotCore.FarmwareRuntime, + FarmbotCore.Firmware.Avrdude, + FarmbotCore.Firmware.Command, + FarmbotCore.Firmware.ConfigUploader, + FarmbotCore.Firmware.Flash, + FarmbotCore.Firmware.FlashUtils, + FarmbotCore.Firmware.Resetter, + FarmbotCore.Firmware.TxBuffer, + FarmbotCore.Firmware.UARTCore, + FarmbotCore.Firmware.UARTCoreSupport, + FarmbotCore.Firmware.UARTDetector, + FarmbotCore.FirmwareEstopTimer, + FarmbotCore.Leds, + FarmbotCore.LogExecutor, + FarmbotCore.Logger, + FarmbotExt.API, + FarmbotExt.API.Reconciler, + FarmbotExt.API.SyncGroup, + FarmbotExt.APIFetcher, + FarmbotExt.Bootstrap.Authorization, + FarmbotExt.Bootstrap.DropPasswordSupport, + FarmbotExt.EagerLoader.Supervisor, + FarmbotExt.MQTT, + FarmbotExt.MQTT.LogHandlerSupport, + FarmbotExt.MQTT.Support, + FarmbotExt.MQTT.SyncHandlerSupport, + FarmbotExt.MQTT.TerminalHandlerSupport, + FarmbotExt.MQTT.TopicSupervisor, + FarmbotExt.Time, + FarmbotOS.Configurator.ConfigDataLayer, + FarmbotOS.Configurator.DetsTelemetryLayer, + FarmbotOS.Configurator.FakeNetworkLayer, + FarmbotOS.HTTP, + FarmbotOS.Lua.DataManipulation, + FarmbotOS.Lua.Firmware, + FarmbotOS.Lua.Info, + FarmbotOS.SysCalls, + FarmbotOS.SysCalls.ChangeOwnership.Support, + FarmbotOS.SysCalls.Farmware, + FarmbotOS.SysCalls.Movement, + FarmbotOS.SysCalls.ResourceUpdate, + FarmbotOS.UpdateSupport, + FarmbotTelemetry, + File, + MuonTrap, + System, + Timex, + Tortoise +] +|> Enum.map(&Mimic.copy/1) + +ExUnit.start() diff --git a/farmbot_ext/test/vendor/rsa_test.exs b/test/vendor/rsa_test.exs similarity index 57% rename from farmbot_ext/test/vendor/rsa_test.exs rename to test/vendor/rsa_test.exs index 5cad3525c..c374dd513 100644 --- a/farmbot_ext/test/vendor/rsa_test.exs +++ b/test/vendor/rsa_test.exs @@ -1,9 +1,10 @@ defmodule RSATest do require Helpers use ExUnit.Case + alias FarmbotExt.Bootstrap.Authorization - def priv_key(), do: RSA.decode_key(Helpers.priv_key()) - def pub_key(), do: RSA.decode_key(Helpers.pub_key()) + def priv_key(), do: Authorization.rsa_decode_key(Helpers.priv_key()) + def pub_key(), do: Authorization.rsa_decode_key(Helpers.pub_key()) test "decode_key" do {:RSAPublicKey, huge_integer, small_integer} = pub_key() @@ -12,7 +13,7 @@ defmodule RSATest do end test "encryption" do - ct = RSA.encrypt("TOP SECRET", {:public, pub_key()}) + ct = Authorization.rsa_encrypt("TOP SECRET", {:public, pub_key()}) pt = :public_key.decrypt_private(ct, priv_key()) assert pt == "TOP SECRET" From 5ebdca3afd672eb6b0af5c71cfca02488b32569a Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Tue, 26 Oct 2021 18:19:48 -0500 Subject: [PATCH 12/15] Minor followup changes (#1416) Don't show dropped firmware messages to end user. --- VERSION | 2 +- config/config.exs | 10 ++++++++-- config/target.exs | 4 +++- lib/firmware/gcode_decoder.ex | 3 +-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/VERSION b/VERSION index 0094eb4c2..ca90f670f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.6.0-rc7 +14.6.0-rc9 diff --git a/config/config.exs b/config/config.exs index 55c6cd1b9..392e46988 100644 --- a/config/config.exs +++ b/config/config.exs @@ -12,7 +12,10 @@ config :tesla, adapter: Tesla.Adapter.Hackney Elixir.FarmbotCore.AssetWorker.FarmbotCore.Asset.PublicKey => [ ssh_handler: FarmbotCore.PublicKeyHandler.StubSSHHandler ], - FarmbotCore.Asset.Repo => [database: "database.#{Mix.env()}.db", log: false], + FarmbotCore.Asset.Repo => [ + database: "database.#{Mix.env()}.db", + log: false + ], FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding => [ gpio_handler: FarmbotCore.PinBindingWorker.StubGPIOHandler ], @@ -41,7 +44,10 @@ if rollbar_token && !is_test? do access_token: rollbar_token, environment: "production", enable_crash_reports: true, - custom: %{fbos_version: Mix.Project.config()[:version]} + custom: %{ + fbos_version: Mix.Project.config()[:version], + fbos_target: Mix.target() + } else config :rollbax, enabled: false end diff --git a/config/target.exs b/config/target.exs index 46cf6da6b..6c0dacf90 100644 --- a/config/target.exs +++ b/config/target.exs @@ -39,7 +39,9 @@ config :vintage_net, config: [{"wlan0", %{type: VintageNet.Technology.Null}}] %{ - FarmbotCore.Asset.Repo => [database: "/root/database.#{Mix.env()}.db"], + FarmbotCore.Asset.Repo => [ + database: "/root/database.#{Mix.env()}.db" + ], FarmbotCore.AssetWorker.FarmbotCore.Asset.PinBinding => [ gpio_handler: FarmbotOS.Platform.Target.PinBindingWorker.CircuitsGPIOHandler ], diff --git a/lib/firmware/gcode_decoder.ex b/lib/firmware/gcode_decoder.ex index 09c021571..94ffe125b 100644 --- a/lib/firmware/gcode_decoder.ex +++ b/lib/firmware/gcode_decoder.ex @@ -3,7 +3,6 @@ defmodule FarmbotCore.Firmware.GCodeDecoder do """ require Logger - require FarmbotCore.Logger @response_codes %{ "00" => :idle, @@ -76,7 +75,7 @@ defmodule FarmbotCore.Firmware.GCodeDecoder do defp validate_message(message) do log = "Dropping malformed message: #{inspect(message)}" - FarmbotCore.Logger.debug(3, log) + Logger.debug(3, log) nil end From 4f5f25a03ac14e1198e337f2c29965ec0ae5f0d9 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 27 Oct 2021 08:58:48 -0500 Subject: [PATCH 13/15] Fix FirmwareEStopTimer temer ref leak (#1417) * estop timer fix --- lib/core/firmware_estop_timer.ex | 14 +++++--------- lib/os/configurator/router.ex | 3 ++- .../{estop_timer.exs => estop_timer_test.exs} | 0 3 files changed, 7 insertions(+), 10 deletions(-) rename test/firmware/{estop_timer.exs => estop_timer_test.exs} (100%) diff --git a/lib/core/firmware_estop_timer.ex b/lib/core/firmware_estop_timer.ex index 25381f93c..ea60507f7 100644 --- a/lib/core/firmware_estop_timer.ex +++ b/lib/core/firmware_estop_timer.ex @@ -11,8 +11,6 @@ defmodule FarmbotCore.FirmwareEstopTimer do @msg "Farmbot has been E-Stopped for more than 10 minutes." @ten_minutes_ms 60_0000 - alias FarmbotCore.Firmware.UARTCoreSupport - def start_timer(timer_server \\ __MODULE__) do GenServer.call(timer_server, :start_timer) end @@ -40,12 +38,13 @@ defmodule FarmbotCore.FirmwareEstopTimer do end def handle_call(:start_timer, _from, state) do + maybe_cancel(state.timer) timer = Process.send_after(self(), :timeout, state.timeout_ms) {:reply, timer, %{state | timer: timer}} end def handle_call(:cancel_timer, _from, state) do - state.timer && Process.cancel_timer(state.timer) + maybe_cancel(state.timer) {:reply, state.timer, %{state | timer: nil}, :hibernate} end @@ -54,10 +53,7 @@ defmodule FarmbotCore.FirmwareEstopTimer do {:noreply, %{state | timer: nil}, :hibernate} end - @doc false - def do_log do - if UARTCoreSupport.locked?() do - FarmbotCore.Logger.warn(1, @msg, channels: [:fatal_email]) - end - end + def do_log(), do: FarmbotCore.Logger.warn(1, @msg, channels: [:fatal_email]) + defp maybe_cancel(nil), do: nil + defp maybe_cancel(timer), do: Process.cancel_timer(timer) end diff --git a/lib/os/configurator/router.ex b/lib/os/configurator/router.ex index fb2ab2d09..59411ca75 100644 --- a/lib/os/configurator/router.ex +++ b/lib/os/configurator/router.ex @@ -2,6 +2,7 @@ defmodule FarmbotOS.Configurator.Router do @moduledoc "Routes web connections for configuring farmbot os" require FarmbotCore.Logger + require Logger require FarmbotTelemetry import Phoenix.HTML @@ -239,7 +240,7 @@ defmodule FarmbotOS.Configurator.Router do case conn.body_params do %{"email" => email, "password" => pass, "server" => server} -> if server = test_uri(server) do - FarmbotCore.Logger.info(1, "server valid: #{server}") + Logger.info("server valid: #{server}") conn |> put_session("auth_config_email", email) diff --git a/test/firmware/estop_timer.exs b/test/firmware/estop_timer_test.exs similarity index 100% rename from test/firmware/estop_timer.exs rename to test/firmware/estop_timer_test.exs From 762019a002f58ccd6b902ffc7f1f053a7e23eb5b Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Wed, 27 Oct 2021 15:35:58 -0500 Subject: [PATCH 14/15] v14.6.0, Ready for release (#1418) v14.6.0, Ready for release --- VERSION | 2 +- lib/firmware/gcode_decoder.ex | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ca90f670f..df249f48e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.6.0-rc9 +14.6.0 diff --git a/lib/firmware/gcode_decoder.ex b/lib/firmware/gcode_decoder.ex index 94ffe125b..7847a2ac3 100644 --- a/lib/firmware/gcode_decoder.ex +++ b/lib/firmware/gcode_decoder.ex @@ -75,7 +75,7 @@ defmodule FarmbotCore.Firmware.GCodeDecoder do defp validate_message(message) do log = "Dropping malformed message: #{inspect(message)}" - Logger.debug(3, log) + Logger.debug(log) nil end From 22295002cfaa49e253e542bd6ede237ebae35200 Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Thu, 28 Oct 2021 09:53:17 -0500 Subject: [PATCH 15/15] Fix bu reported by @jsimmonds2 (#1420) prevent encoding error when serializing local_id. --- COVERAGE.md | 8 +++- lib/core/asset/repo.ex | 8 ++++ lib/core/asset_workers/peripheral_worker.ex | 6 ++- lib/ext/dirty_worker.ex | 10 ++--- test/asset_workers/peripheral_worker_test.exs | 45 +++++++++++++++++++ test/farmbot_ext/api/dirty_worker_test.exs | 31 +++++-------- test/test_helper.exs | 1 + 7 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 test/asset_workers/peripheral_worker_test.exs diff --git a/COVERAGE.md b/COVERAGE.md index 4ef6c19fa..f2992fa12 100644 --- a/COVERAGE.md +++ b/COVERAGE.md @@ -1,4 +1,10 @@ -# Jan - Mar 2021 +# Coverage Stats + +2021/10/28 - 64.3% + +# Historic + +Code coverage prior to conversion of app to monolith: | Project |1/1/20 |2/6/20 |3/4/20 |3/26/21|5/25/21| |-----------------------|-------|-------|-------|-------|-------| diff --git a/lib/core/asset/repo.ex b/lib/core/asset/repo.ex index cd59f0d14..0b408b87f 100644 --- a/lib/core/asset/repo.ex +++ b/lib/core/asset/repo.ex @@ -1,4 +1,12 @@ defmodule FarmbotCore.Asset.Repo do @moduledoc "Repo for storing Asset data." use Ecto.Repo, otp_app: :farmbot, adapter: Ecto.Adapters.SQLite3 + + # Local IDs are binary now. + # This causes lots of issues when printing + # or sending logs to the API. This method exists for + # safety. + def encode_local_id(local_id) do + local_id |> inspect() |> Base.encode64() |> String.slice(0..10) + end end diff --git a/lib/core/asset_workers/peripheral_worker.ex b/lib/core/asset_workers/peripheral_worker.ex index f4d3cd8c2..f0325b3eb 100644 --- a/lib/core/asset_workers/peripheral_worker.ex +++ b/lib/core/asset_workers/peripheral_worker.ex @@ -2,7 +2,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do use GenServer require Logger - alias FarmbotCore.{Asset.Peripheral, BotState} + alias FarmbotCore.{Asset.Repo, Asset.Peripheral, BotState} alias FarmbotCore.Celery.AST @retry_ms 1_000 @@ -106,8 +106,10 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do end def peripheral_to_rpc(peripheral) do + uuid = Repo.encode_local_id(peripheral.local_id || "unknown") + AST.Factory.new() - |> AST.Factory.rpc_request(peripheral.local_id) + |> AST.Factory.rpc_request(uuid) |> AST.Factory.set_pin_io_mode(peripheral.pin, "output") |> AST.Factory.read_pin(peripheral.pin, peripheral.mode) end diff --git a/lib/ext/dirty_worker.ex b/lib/ext/dirty_worker.ex index 0b9ab0e62..0709a968d 100644 --- a/lib/ext/dirty_worker.ex +++ b/lib/ext/dirty_worker.ex @@ -177,11 +177,11 @@ defmodule FarmbotExt.DirtyWorker do # HTTP Error. (500, network error, timeout etc.) def handle_http_response(dirty, module, error) do - FarmbotCore.Logger.error( - 2, - "[#{module} #{dirty.local_id} #{inspect(self())}] HTTP Error: #{module} #{inspect(error)}" - ) - + m = inspect(module) + e = inspect(error) + id = Repo.encode_local_id(dirty.local_id) + msg = "[#{m} #{id} #{inspect(self())}] HTTP Error: #{e}" + FarmbotCore.Logger.error(2, msg) error end diff --git a/test/asset_workers/peripheral_worker_test.exs b/test/asset_workers/peripheral_worker_test.exs new file mode 100644 index 000000000..1d947b2da --- /dev/null +++ b/test/asset_workers/peripheral_worker_test.exs @@ -0,0 +1,45 @@ +defmodule FarmbotCore.Asset.PeripheralWorkerTest do + use ExUnit.Case + use Mimic + + alias FarmbotCore.Celery.AST + alias FarmbotCore.AssetWorker.FarmbotCore.Asset.Peripheral, as: Worker + alias FarmbotCore.Asset.Peripheral + + setup :verify_on_exit! + + test "peripheral_to_rpc/1" do + raw = <<154, 60, 54, 238, 159, 53, 21, 160, 176, 202, 22, 177, 28>> + encoded = "PDwxNTQsIDY" + + peripheral = %Peripheral{ + local_id: raw, + mode: "output", + pin: 123 + } + + expect(AST.Factory, :new, 1, fn -> :fake_ast1 end) + + expect(AST.Factory, :rpc_request, 1, fn ast, uuid -> + assert ast == :fake_ast1 + assert uuid == encoded + :fake_ast2 + end) + + expect(AST.Factory, :set_pin_io_mode, 1, fn ast, pin, mode -> + assert mode == "output" + assert pin == 123 + assert ast == :fake_ast2 + :fake_ast3 + end) + + expect(AST.Factory, :read_pin, 1, fn ast, pin, mode -> + assert ast == :fake_ast3 + assert pin == 123 + assert mode == "output" + :fake_ast4 + end) + + assert :fake_ast4 == Worker.peripheral_to_rpc(peripheral) + end +end diff --git a/test/farmbot_ext/api/dirty_worker_test.exs b/test/farmbot_ext/api/dirty_worker_test.exs index 195f750a7..d395edf43 100644 --- a/test/farmbot_ext/api/dirty_worker_test.exs +++ b/test/farmbot_ext/api/dirty_worker_test.exs @@ -48,6 +48,16 @@ defmodule FarmbotExt.DirtyWorkerTest do DirtyWorker.maybe_resync(0) end + test "handle_http_response - other response" do + Helpers.delete_all_points() + Repo.delete_all(LocalMeta) + Repo.delete_all(FbosConfig) + Helpers.expect_log("HTTP Error: {:error, :other}") + + p = Helpers.create_point(%{id: 2, pointer_type: "Weed"}) + DirtyWorker.handle_http_response(p, Point, {:error, :other}) + end + test "handle_http_response - 409 response" do Helpers.delete_all_points() Repo.delete_all(LocalMeta) @@ -106,25 +116,4 @@ defmodule FarmbotExt.DirtyWorkerTest do assert :ok == DirtyWorker.finalize(stub_data, Point) end - - # This test blinks too much: - # - # test "init" do - # Helpers.delete_all_points() - # Helpers.use_fake_jwt() - # {:ok, pid} = DirtyWorker.start_link(module: Point, timeout: 0) - # state = :sys.get_state(pid) - # assert state == %{module: Point} - # Helpers.wait_for(pid) - # GenServer.stop(pid, :normal) - # end - - # This test blinks too much: - # - # test "work/2 error" do - # Helpers.delete_all_points() - # Helpers.use_fake_jwt() - # %mod{} = p = Helpers.create_point(%{id: 0, pointer_type: "Plant"}) - # {:error, _} = DirtyWorker.work(p, mod) - # end end diff --git a/test/test_helper.exs b/test/test_helper.exs index f709e2d6c..b6ab16735 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -307,6 +307,7 @@ ExUnit.configure( FarmbotCore.Asset.Repo, FarmbotCore.BotState, FarmbotCore.Celery, + FarmbotCore.Celery.AST.Factory, FarmbotCore.Celery.Compiler.Lua, FarmbotCore.Celery.Scheduler, FarmbotCore.Celery.SpecialValue,