diff --git a/.circleci/config.yml b/.circleci/config.yml index cee446517..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,101 +152,6 @@ jobs: ################################################################################ # TEST # ################################################################################ - - 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: @@ -264,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 @@ -277,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 @@ -388,18 +288,6 @@ workflows: version: 2 test: jobs: - - 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 9b1fa0f88..04bbb7e49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +# 14.6.0 + + * Upgrade database driver. + * Convert application to a monolith. + +# 14.5.0 + + * 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 * Update Erlang version diff --git a/COVERAGE.md b/COVERAGE.md index 088321c46..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| |-----------------------|-------|-------|-------|-------|-------| @@ -15,3 +21,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/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 a74a70e5d..df249f48e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -14.4.1 +14.6.0 diff --git a/config/config.exs b/config/config.exs new file mode 100644 index 000000000..392e46988 --- /dev/null +++ b/config/config.exs @@ -0,0 +1,60 @@ +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], + fbos_target: Mix.target() + } +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..6c0dacf90 --- /dev/null +++ b/config/target.exs @@ -0,0 +1,70 @@ +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 74% rename from farmbot_os/coveralls.json rename to coveralls.json index eb2c5891e..021731ea4 100644 --- a/farmbot_os/coveralls.json +++ b/coveralls.json @@ -1,6 +1,6 @@ { "coverage_options": { "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 55 + "minimum_coverage": 60 } } 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 d4223afa4..000000000 --- a/farmbot_core/config/dev.exs +++ /dev/null @@ -1,4 +0,0 @@ -use Mix.Config - -config :farmbot_core, FarmbotCeleryScript.SysCalls, - sys_calls: FarmbotCeleryScript.SysCalls.Stubs diff --git a/farmbot_core/config/test.exs b/farmbot_core/config/test.exs deleted file mode 100644 index 72b32d4a0..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, FarmbotCeleryScript.SysCalls, - sys_calls: FarmbotCeleryScript.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 8ffdcb7b3..000000000 --- a/farmbot_core/coveralls.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "coverage_options": { - "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 0.42 - }, - "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_celery_script/compilers/lua.ex b/farmbot_core/lib/farmbot_celery_script/compilers/lua.ex deleted file mode 100644 index 970a37b58..000000000 --- a/farmbot_core/lib/farmbot_celery_script/compilers/lua.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule FarmbotCeleryScript.Compiler.Lua do - alias FarmbotCeleryScript.SysCalls - alias FarmbotCeleryScript.Compiler.{ VariableTransformer, Scope, } - - def lua(%{args: %{lua: lua}}, cs_scope) do - quote location: :keep do - # lua.ex - mod = unquote(__MODULE__) - mod.do_lua(unquote(lua), unquote(cs_scope)) - end - end - - def do_lua(lua, cs_scope) do - go = fn label, lua -> - {:ok, variable} = Scope.fetch!(cs_scope, label) - {VariableTransformer.run!(variable), lua} - end - - lookup = 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/lib/farmbot_celery_script/interpolation.ex b/farmbot_core/lib/farmbot_celery_script/interpolation.ex deleted file mode 100644 index be70069aa..000000000 --- a/farmbot_core/lib/farmbot_celery_script/interpolation.ex +++ /dev/null @@ -1,33 +0,0 @@ -defmodule FarmbotCeleryScript.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 - 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() - Float.round(dividend / divisor, 2) - end - end - - defp dist(from, to) do - x = :math.pow(to.x - from.x, 2) - y = :math.pow(to.y - from.y, 2) - :math.pow(x + y, 0.5) - 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) - end -end diff --git a/farmbot_core/lib/farmbot_core.ex b/farmbot_core/lib/farmbot_core.ex deleted file mode 100644 index f2f687517..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, - FarmbotCeleryScript.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/repo.ex b/farmbot_core/lib/farmbot_core/asset/repo.ex deleted file mode 100644 index c02ff9895..000000000 --- a/farmbot_core/lib/farmbot_core/asset/repo.ex +++ /dev/null @@ -1,4 +0,0 @@ -defmodule FarmbotCore.Asset.Repo do - @moduledoc "Repo for storing Asset data." - use Ecto.Repo, otp_app: :farmbot_core -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 251fd61b2..000000000 --- a/farmbot_core/lib/farmbot_core/asset_workers/farm_event_worker/sequence_event.ex +++ /dev/null @@ -1,61 +0,0 @@ -defmodule FarmbotCore.FarmEventWorker.SequenceEvent do - require Logger - require FarmbotCore.Logger - alias FarmbotCeleryScript.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}} - 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) - |> Enum.each(fn(at) -> - schedule_sequence(farm_event, at) - end) - {:noreply, state} - end - - def handle_info({FarmbotCeleryScript, {: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} - FarmbotCeleryScript.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 f3ecaf37d..000000000 --- a/farmbot_core/mix.exs +++ /dev/null @@ -1,91 +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.3"}, - {:ex_doc, "~> 0.25.2", only: [:dev], targets: [:host], runtime: false}, - {:excoveralls, "~> 0.14.2", 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"} - ] - 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 e6fb808a4..000000000 --- a/farmbot_core/mix.lock +++ /dev/null @@ -1,50 +0,0 @@ -%{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, - "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.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"}, - "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"}, - "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_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.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm", "8f7168911120e13419e086e78d20e4d1a6776f1eee2411ac9f790af10813389f"}, - "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"}, - "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/dot_props_test.exs b/farmbot_core/test/dot_props_test.exs deleted file mode 100644 index 0ff67e432..000000000 --- a/farmbot_core/test/dot_props_test.exs +++ /dev/null @@ -1,4 +0,0 @@ -defmodule FarmbotCeleryScript.DotPropsTest do - use ExUnit.Case - doctest FarmbotCeleryScript.DotProps, import: true -end diff --git a/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs b/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs deleted file mode 100644 index 0cf4acf80..000000000 --- a/farmbot_core/test/farmbot_celery_script/ast/factory_test.exs +++ /dev/null @@ -1,4 +0,0 @@ -defmodule FarmbotCeleryScript.AST.FactoryTest do - use ExUnit.Case - doctest FarmbotCeleryScript.AST.Factory, import: true -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 deleted file mode 100644 index 0faea031b..000000000 --- a/farmbot_core/test/farmbot_celery_script/lua_compiler_test.exs +++ /dev/null @@ -1,18 +0,0 @@ -defmodule FarmbotCeleryScript.LuaTest do - use ExUnit.Case - alias FarmbotCeleryScript.Compiler.Lua - alias FarmbotCeleryScript.Compiler.Scope - - test "conversion of `cs_scope` to luerl params" do - cs_scope = %Scope{ - declarations: %{ - "parent" => %{x: 1, y: 2, z: 3}, - "nachos" => %{x: 4, y: 5, z: 6} - } - } - - result = Lua.do_lua("variables.parent.x", cs_scope) - expected = {:error, "CeleryScript syscall stubbed: perform_lua\n"} - assert result == expected - 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/firmware/rx_buffer_test.exs b/farmbot_core/test/firmware/rx_buffer_test.exs deleted file mode 100644 index 017510f73..000000000 --- a/farmbot_core/test/firmware/rx_buffer_test.exs +++ /dev/null @@ -1,40 +0,0 @@ -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/test_helper.exs b/farmbot_core/test/test_helper.exs deleted file mode 100644 index 3cf6bafb8..000000000 --- a/farmbot_core/test/test_helper.exs +++ /dev/null @@ -1,36 +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, - FarmbotCeleryScript, - FarmbotCeleryScript.Compiler.Lua, - FarmbotCeleryScript.Scheduler, - FarmbotCeleryScript.SpecialValue, - FarmbotCeleryScript.SysCalls, - FarmbotCeleryScript.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, - 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 c7d0feb4e..000000000 --- a/farmbot_ext/config/config.exs +++ /dev/null @@ -1,74 +0,0 @@ -use Mix.Config - -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 - -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.API.DirtyWorker.Supervisor, - FarmbotExt.API.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 9072ea43d..000000000 --- a/farmbot_ext/coveralls.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "coverage_options": { - "treat_no_relevant_lines_as_covered": true, - "minimum_coverage": 48.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/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/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/mix.exs b/farmbot_ext/mix.exs deleted file mode 100644 index aef186160..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.9.9"}, - {:ex_doc, "~> 0.25.2", 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.16"}, - {: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 fc7b90e40..000000000 --- a/farmbot_ext/mix.lock +++ /dev/null @@ -1,55 +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.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, - "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.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"}, - "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"}, - "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.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"}, - "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"}, - "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.9.9", "2e467570ef1d342d4de8fdc6ba3861f841054ab524080ec3d7052ee07c04501d", [:mix], [{:gen_state_machine, "~> 2.0 or ~> 3.0", [hex: :gen_state_machine, repo: "hexpm", optional: false]}], "hexpm", "4a316220b4b443c2497f42702f0c0616af3e4b2cbc6c150ebebb51657a773797"}, - "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 18f4da833..000000000 --- a/farmbot_ext/test/farmbot_ext/http_test.exs +++ /dev/null @@ -1,12 +0,0 @@ -defmodule FarmbotExt.HTTPTest do - # def request(method, params, opts1, opts2) do - # :httpc.request(method, params, opts1, opts2) - # end - use ExUnit.Case - alias FarmbotExt.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 9c0e483e2..000000000 --- a/farmbot_ext/test/test_helper.exs +++ /dev/null @@ -1,102 +0,0 @@ -Application.ensure_all_started(:farmbot) -Application.ensure_all_started(:mimic) - -[ - Ecto.Changeset, - ExTTY, - FarmbotCeleryScript.SysCalls, - FarmbotCeleryScript.SysCalls.Stubs, - FarmbotCore.Asset.Command, - FarmbotCore.Asset.Private, - FarmbotCore.Asset.Repo, - FarmbotCore.BotState, - FarmbotCore.BotStateNG, - FarmbotCore.Config, - FarmbotCore.Leds, - FarmbotCore.LogExecutor, - FarmbotCore.Logger, - FarmbotExt.API, - FarmbotExt.API.EagerLoader, - FarmbotExt.API.EagerLoader.Supervisor, - FarmbotExt.API.Preloader, - FarmbotExt.API.Reconciler, - FarmbotExt.API.SyncGroup, - FarmbotExt.APIFetcher, - FarmbotExt.Bootstrap.Authorization, - FarmbotExt.Bootstrap.DropPasswordSupport, - FarmbotExt.HTTP, - FarmbotExt.MQTT, - FarmbotExt.MQTT.LogHandlerSupport, - FarmbotExt.MQTT.Support, - FarmbotExt.MQTT.SyncHandlerSupport, - FarmbotExt.MQTT.TerminalHandlerSupport, - FarmbotExt.Time, - FarmbotTelemetry, - 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 9ca4fc101..000000000 --- a/farmbot_os/config/config.exs +++ /dev/null @@ -1,92 +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, FarmbotCeleryScript.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 1cfe0d868..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.2", 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"}, - {: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}, - {:nerves_time, "~> 0.4.3", 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"}, - {: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} - ] - 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 07287c384..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.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, - "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.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"}, - "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"}, - "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.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"}, - "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", "ce4e1b5a66a2a37efe2f8cd16e365ad9845b5015", []}, - "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"}, - "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.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_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.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"}, - "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_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"}, - "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 70e00da26..000000000 --- a/farmbot_os/test/test_helper.exs +++ /dev/null @@ -1,40 +0,0 @@ -Application.ensure_all_started(:mimic) - -[ - FarmbotCeleryScript.SpecialValue, - FarmbotCeleryScript.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, - FarmbotExt.HTTP, - FarmbotOS.Configurator.ConfigDataLayer, - FarmbotOS.Configurator.DetsTelemetryLayer, - FarmbotOS.Configurator.FakeNetworkLayer, - FarmbotOS.Lua.Ext.DataManipulation, - FarmbotOS.Lua.Ext.Firmware, - FarmbotOS.Lua.Ext.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/mix.exs b/farmbot_telemetry/mix.exs deleted file mode 100644 index 319ef7674..000000000 --- a/farmbot_telemetry/mix.exs +++ /dev/null @@ -1,56 +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: [:logger, :crypto], - mod: {FarmbotTelemetry.Application, []} - ] - end - - # Run "mix help deps" to learn about dependencies. - defp deps 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} - ] - end -end diff --git a/farmbot_telemetry/mix.lock b/farmbot_telemetry/mix.lock deleted file mode 100644 index dbcf2485f..000000000 --- a/farmbot_telemetry/mix.lock +++ /dev/null @@ -1,23 +0,0 @@ -%{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, - "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"}, - "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/farmbot_telemetry_test.exs b/farmbot_telemetry/test/farmbot_telemetry_test.exs deleted file mode 100644 index 7e4707ae4..000000000 --- a/farmbot_telemetry/test/farmbot_telemetry_test.exs +++ /dev/null @@ -1,46 +0,0 @@ -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], - %{measurement: :measurement, value: 1.0}, _meta, _config} - end - - test "assigns meta" do - :ok = FarmbotTelemetry.attach_recv(:event, :test_subsystem, self()) - - :ok = - FarmbotTelemetry.event(:test_subsystem, :measurement, 1.0, hello: "world") - - assert_receive {[:farmbot_telemetry, :event, :test_subsystem], - %{measurement: :measurement, value: 1.0}, meta, _config} - - 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 - end -end 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/farmbot_celery_script.ex b/lib/celery.ex similarity index 60% rename from farmbot_core/lib/farmbot_celery_script.ex rename to lib/celery.ex index 1bc48508f..9e3221494 100644 --- a/farmbot_core/lib/farmbot_celery_script.ex +++ b/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" @@ -11,10 +11,11 @@ defmodule FarmbotCeleryScript 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/farmbot_celery_script/ast.ex b/lib/celery/ast.ex similarity index 97% rename from farmbot_core/lib/farmbot_celery_script/ast.ex rename to lib/celery/ast.ex index 3b831697e..3299ad63b 100644 --- a/farmbot_core/lib/farmbot_celery_script/ast.ex +++ b/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/lib/celery/ast/factory.ex similarity index 89% rename from farmbot_core/lib/farmbot_celery_script/ast/factory.ex rename to lib/celery/ast/factory.ex index e4a4f4f9d..2fd0c8fe2 100644 --- a/farmbot_core/lib/farmbot_celery_script/ast/factory.ex +++ b/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/lib/celery/compiler.ex similarity index 86% rename from farmbot_core/lib/farmbot_celery_script/compiler.ex rename to lib/celery/compiler.ex index 0b062e3b2..a72ecb1e3 100644 --- a/farmbot_core/lib/farmbot_celery_script/compiler.ex +++ b/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 @@ -83,6 +83,7 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.Compiler do def nothing(_ast, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.nothing() + FarmbotCore.Celery.SysCallGlue.nothing() end end @@ -112,9 +113,10 @@ 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) + 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 FarmbotCeleryScript.Compiler do end) quote location: :keep do - FarmbotCeleryScript.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 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.SysCallGlue.emergency_lock() end end def emergency_unlock(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.emergency_unlock() + FarmbotCore.Celery.SysCallGlue.emergency_unlock() end end def read_status(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.read_status() + FarmbotCore.Celery.SysCallGlue.read_status() end end def sync(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.sync() + FarmbotCore.Celery.SysCallGlue.sync() end end def check_updates(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.check_update() + FarmbotCore.Celery.SysCallGlue.check_update() end end def flash_firmware(%{args: %{package: package_name}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.flash_firmware( + FarmbotCore.Celery.SysCallGlue.flash_firmware( unquote(celery_to_elixir(package_name, cs_scope)) ) end @@ -193,25 +197,25 @@ defmodule FarmbotCeleryScript.Compiler do def power_off(_, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.power_off() + FarmbotCore.Celery.SysCallGlue.power_off() end end def reboot(%{args: %{package: "farmbot_os"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.reboot() + FarmbotCore.Celery.SysCallGlue.reboot() end end def reboot(%{args: %{package: "arduino_firmware"}}, _cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.firmware_reboot() + FarmbotCore.Celery.SysCallGlue.firmware_reboot() end end def factory_reset(%{args: %{package: package}}, cs_scope) do quote location: :keep do - FarmbotCeleryScript.SysCalls.factory_reset( + FarmbotCore.Celery.SysCallGlue.factory_reset( unquote(celery_to_elixir(package, cs_scope)) ) end @@ -232,7 +236,7 @@ defmodule FarmbotCeleryScript.Compiler do server = Map.get(pairs, "server") quote location: :keep do - FarmbotCeleryScript.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/farmbot_celery_script/compiler/utils.ex b/lib/celery/compiler/utils.ex similarity index 58% rename from farmbot_core/lib/farmbot_celery_script/compiler/utils.ex rename to lib/celery/compiler/utils.ex index dacfa418a..3c191513e 100644 --- a/farmbot_core/lib/farmbot_celery_script/compiler/utils.ex +++ b/lib/celery/compiler/utils.ex @@ -1,9 +1,10 @@ -defmodule FarmbotCeleryScript.Compiler.Utils do - alias FarmbotCeleryScript.{ +defmodule FarmbotCore.Celery.Compiler.Utils do + alias FarmbotCore.Celery.{ Compiler, AST, Compiler.Scope } + @doc """ Recursively compiles a list or single Celery AST into an Elixir `__block__` """ @@ -20,8 +21,11 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.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 -> - FarmbotCeleryScript - .SysCalls - .sequence_init_log(unquote(message)) - :ok - end + FarmbotCore.Celery.SysCallGlue.sequence_init_log(unquote(message)) + :ok + end end ] + back = [ quote do fn -> - FarmbotCeleryScript - .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/farmbot_celery_script/compilers/assertion_compiler.ex b/lib/celery/compilers/assertion_compiler.ex similarity index 74% rename from farmbot_core/lib/farmbot_celery_script/compilers/assertion_compiler.ex rename to lib/celery/compilers/assertion_compiler.ex index 7739b8e8f..66fa16ac1 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/assertion_compiler.ex +++ b/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( %{ @@ -9,24 +9,28 @@ defmodule FarmbotCeleryScript.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 = 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) assertion_type = unquote(assertion_type) cs_scope = unquote(cs_scope) result = unquote(result) + case result do {:error, reason} -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed to evaluate, aborting" @@ -35,7 +39,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do {:error, reason} {:ok, [true]} -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( true, assertion_type, "#{comment_header}passed, continuing execution" @@ -44,7 +48,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do :ok {:ok, _} when assertion_type == "continue" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, continuing execution" @@ -53,7 +57,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do :ok {:ok, _} when assertion_type == "abort" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, aborting" @@ -62,7 +66,7 @@ defmodule FarmbotCeleryScript.Compiler.Assertion do {:error, "Assertion failed (aborting)"} {:ok, _} when assertion_type == "recover" -> - FarmbotCeleryScript.SysCalls.log_assertion( + FarmbotCore.Celery.SysCallGlue.log_assertion( false, assertion_type, "#{comment_header}failed, recovering and continuing" @@ -71,17 +75,18 @@ 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.SysCallGlue.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/lib/celery/compilers/axis_control_compiler.ex similarity index 50% rename from farmbot_core/lib/farmbot_celery_script/compilers/axis_control_compiler.ex rename to lib/celery/compilers/axis_control_compiler.ex index 9e55c7dd6..9958b64b9 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/axis_control_compiler.ex +++ b/lib/celery/compilers/axis_control_compiler.ex @@ -1,64 +1,70 @@ -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 - [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 = 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, - 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) <- - FarmbotCeleryScript.SysCalls.get_current_x(), + FarmbotCore.Celery.SysCallGlue.get_current_x(), cury when is_number(cury) <- - FarmbotCeleryScript.SysCalls.get_current_y(), + FarmbotCore.Celery.SysCallGlue.get_current_y(), curz when is_number(curz) <- - FarmbotCeleryScript.SysCalls.get_current_z() do + FarmbotCore.Celery.SysCallGlue.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.SysCallGlue.log( "Moving relative to (#{x_str}, #{y_str}, #{z_str})", true ) - FarmbotCeleryScript.SysCalls.move_absolute( + FarmbotCore.Celery.SysCallGlue.move_absolute( x, y, z, @@ -71,11 +77,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.SysCallGlue.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.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 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.SysCallGlue.log( "Finding home on the #{String.upcase(axis)} axis", true ) - FarmbotCeleryScript.SysCalls.find_home(axis) + FarmbotCore.Celery.SysCallGlue.find_home(axis) else {:error, reason} -> {:error, reason} @@ -101,13 +107,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.SysCallGlue.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.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 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.SysCallGlue.log( "Going to home on the #{String.upcase(axis)} axis", true ) - FarmbotCeleryScript.SysCalls.home(axis, speed) + FarmbotCore.Celery.SysCallGlue.home(axis, speed) else {:error, reason} -> {:error, reason} @@ -135,11 +141,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.SysCallGlue.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.SysCallGlue.zero("z"), + :ok <- FarmbotCore.Celery.SysCallGlue.zero("y") do + FarmbotCore.Celery.SysCallGlue.zero("x") end end end @@ -149,12 +155,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.SysCallGlue.log( "Setting home for the #{String.upcase(axis)} axis", true ) - FarmbotCeleryScript.SysCalls.zero(axis) + FarmbotCore.Celery.SysCallGlue.zero(axis) else {:error, reason} -> {:error, reason} @@ -165,11 +171,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.SysCallGlue.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.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 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.SysCallGlue.log(msg, true) + FarmbotCore.Celery.SysCallGlue.calibrate(axis) else {:error, reason} -> {:error, reason} end @@ -192,11 +198,11 @@ 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. - 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 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.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(FarmbotCeleryScript.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/farmbot_celery_script/compilers/data_control_compiler.ex b/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 lib/celery/compilers/data_control_compiler.ex index caaadc9e2..0f15081ee 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/data_control_compiler.ex +++ b/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.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 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.SysCallGlue.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.SysCallGlue.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.SysCallGlue.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/lib/celery/compilers/execute_compiler.ex similarity index 75% rename from farmbot_core/lib/farmbot_celery_script/compilers/execute_compiler.ex rename to lib/celery/compilers/execute_compiler.ex index 82f33a533..44046683e 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/execute_compiler.ex +++ b/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,14 +14,16 @@ 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.SysCallGlue.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 end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/farmware_compiler.ex b/lib/celery/compilers/farmware_compiler.ex similarity index 72% rename from farmbot_core/lib/farmbot_celery_script/compilers/farmware_compiler.ex rename to lib/celery/compilers/farmware_compiler.ex index c763c5da7..77acdb977 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/farmware_compiler.ex +++ b/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.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 - FarmbotCeleryScript.SysCalls.log("Installing dependencies...") - FarmbotCeleryScript.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 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.SysCallGlue.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.SysCallGlue.log("Updating Farmware: #{package}", true) + FarmbotCore.Celery.SysCallGlue.update_farmware(package) end end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/if_compiler.ex b/lib/celery/compilers/if_compiler.ex similarity index 82% rename from farmbot_core/lib/farmbot_celery_script/compilers/if_compiler.ex rename to lib/celery/compilers/if_compiler.ex index 5b7d037d5..88ff16b2a 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/if_compiler.ex +++ b/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)( @@ -11,7 +11,9 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.Compiler.If do case lhs_ast do "x" -> quote [location: :keep], - do: FarmbotCeleryScript.SysCalls.get_cached_x() + do: FarmbotCore.Celery.SysCallGlue.get_cached_x() "y" -> quote [location: :keep], - do: FarmbotCeleryScript.SysCalls.get_cached_y() + do: FarmbotCore.Celery.SysCallGlue.get_cached_y() "z" -> quote [location: :keep], - do: FarmbotCeleryScript.SysCalls.get_cached_z() + do: FarmbotCore.Celery.SysCallGlue.get_cached_z() "pin" <> pin -> quote [location: :keep], do: - FarmbotCeleryScript.SysCalls.read_cached_pin( + FarmbotCore.Celery.SysCallGlue.read_cached_pin( unquote(String.to_integer(pin)) ) @@ -45,7 +47,7 @@ defmodule FarmbotCeleryScript.Compiler.If do %AST{kind: :named_pin} = ast -> quote [location: :keep], do: - FarmbotCeleryScript.SysCalls.read_cached_pin( + FarmbotCore.Celery.SysCallGlue.read_cached_pin( unquote(Compiler.celery_to_elixir(ast, cs_scope)) ) @@ -118,7 +120,9 @@ defmodule FarmbotCeleryScript.Compiler.If do # nothing() # end quote location: :keep do - prefix_string = FarmbotCeleryScript.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 FarmbotCeleryScript.Compiler.If do end if unquote(if_eval) do - FarmbotCeleryScript.SysCalls.log( + FarmbotCore.Celery.SysCallGlue.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.SysCallGlue.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/lib/celery/compilers/lua.ex b/lib/celery/compilers/lua.ex new file mode 100644 index 000000000..39387f809 --- /dev/null +++ b/lib/celery/compilers/lua.ex @@ -0,0 +1,38 @@ +defmodule FarmbotCore.Celery.Compiler.Lua do + alias FarmbotCore.Celery.SysCallGlue + alias FarmbotCore.Celery.Compiler.{VariableTransformer, Scope} + + def lua(%{args: %{lua: lua}}, cs_scope) do + quote location: :keep do + # lua.ex + mod = unquote(__MODULE__) + mod.do_lua(unquote(lua), unquote(cs_scope)) + end + end + + # 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) + 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 + go = fn label, lua -> + {:ok, variable} = Scope.fetch!(cs_scope, label) + {VariableTransformer.run!(variable), lua} + end + + fn + [label], lua -> go.(label, lua) + [], lua -> go.("parent", lua) + _, _ -> %{error: "Invalid input. Please pass 1 variable name (string)."} + end + end +end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/move_compiler.ex b/lib/celery/compilers/move_compiler.ex similarity index 81% rename from farmbot_core/lib/farmbot_celery_script/compilers/move_compiler.ex rename to lib/celery/compilers/move_compiler.ex index dfce9db6e..49702b274 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/move_compiler.ex +++ b/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.SysCallGlue + alias FarmbotCore.Celery.SpecialValue + alias FarmbotCore.Celery.Compiler.Scope def move(%{body: body}, cs_scope) do quote location: :keep do @@ -22,19 +22,20 @@ defmodule FarmbotCeleryScript.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 @@ -116,20 +117,24 @@ 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) - |> 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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 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.SysCallGlue.get_toolslot_for_tool(id) to_number(axis, tool) end @@ -252,22 +258,22 @@ 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) - :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 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/lib/celery/compilers/pin_control_compiler.ex similarity index 58% rename from farmbot_core/lib/farmbot_celery_script/compilers/pin_control_compiler.ex rename to lib/celery/compilers/pin_control_compiler.ex index 5278a70b6..eb8a19114 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/pin_control_compiler.ex +++ b/lib/celery/compilers/pin_control_compiler.ex @@ -1,13 +1,16 @@ -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 + 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 <- FarmbotCeleryScript.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 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.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)) - FarmbotCeleryScript.SysCalls.log("Writing servo: #{pin}: #{angle}") - FarmbotCeleryScript.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)) - FarmbotCeleryScript.SysCalls.log("Setting pin mode: #{pin}: #{mode}") - FarmbotCeleryScript.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 - FarmbotCeleryScript.SysCalls.toggle_pin(unquote(pin_number)) + FarmbotCore.Celery.SysCallGlue.toggle_pin(unquote(pin_number)) end end def conclude(pin, 0, _value) do - FarmbotCeleryScript.SysCalls.read_pin(pin, 0) + FarmbotCore.Celery.SysCallGlue.read_pin(pin, 0) end def conclude(pin, _mode, value) do - FarmbotCeleryScript.SysCalls.log("Pin #{pin} is #{value} (analog)") + FarmbotCore.Celery.SysCallGlue.log("Pin #{pin} is #{value} (analog)") end end diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/rpc_request_compiler.ex b/lib/celery/compilers/rpc_request_compiler.ex similarity index 61% rename from farmbot_core/lib/farmbot_celery_script/compilers/rpc_request_compiler.ex rename to lib/celery/compilers/rpc_request_compiler.ex index aa90ed1b9..586c106ae 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/rpc_request_compiler.ex +++ b/lib/celery/compilers/rpc_request_compiler.ex @@ -1,8 +1,10 @@ -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() + steps = + Utils.compile_block(block, cs_scope) + |> Utils.decompose_block_to_steps() [ quote location: :keep do diff --git a/farmbot_core/lib/farmbot_celery_script/compilers/scope.ex b/lib/celery/compilers/scope.ex similarity index 81% rename from farmbot_core/lib/farmbot_celery_script/compilers/scope.ex rename to lib/celery/compilers/scope.ex index 952912993..f4ae6fa21 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/scope.ex +++ b/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 @@ -15,7 +15,7 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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/farmbot_celery_script/compilers/sequence_compiler.ex b/lib/celery/compilers/sequence_compiler.ex similarity index 66% rename from farmbot_core/lib/farmbot_celery_script/compilers/sequence_compiler.ex rename to lib/celery/compilers/sequence_compiler.ex index 9f9cb1b84..7736a53a6 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/sequence_compiler.ex +++ b/lib/celery/compilers/sequence_compiler.ex @@ -1,5 +1,6 @@ -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 @@ -13,10 +14,15 @@ defmodule FarmbotCeleryScript.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/farmbot_celery_script/compilers/update_resource_compiler.ex b/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 lib/celery/compilers/update_resource_compiler.ex index 684822d63..1e7f821f6 100644 --- a/farmbot_core/lib/farmbot_celery_script/compilers/update_resource_compiler.ex +++ b/lib/celery/compilers/update_resource_compiler.ex @@ -1,24 +1,29 @@ -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, %{}) + quote location: :keep do me = unquote(__MODULE__) variable = unquote(Map.fetch!(args, :resource)) 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 +33,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.SysCallGlue.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.SysCallGlue.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.SysCallGlue.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/lib/celery/compilers/variable_transformer.ex similarity index 66% rename from farmbot_core/lib/farmbot_celery_script/compilers/variable_transformer.ex rename to lib/celery/compilers/variable_transformer.ex index 9615ad92e..a3b38af3b 100644 --- a/farmbot_core/lib/farmbot_celery_script/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 FarmbotCeleryScript.Compiler.VariableTransformer do - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotCore.Celery.Compiler.VariableTransformer do + 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 FarmbotCeleryScript.Compiler.VariableTransformer do end def run!(%{args: %{tool_id: tool_id}}) do - [FarmbotCeleryScript.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/farmbot_celery_script/corpus.ex b/lib/celery/corpus.ex similarity index 94% rename from farmbot_core/lib/farmbot_celery_script/corpus.ex rename to lib/celery/corpus.ex index 88b574c82..bb6bfb2d7 100644 --- a/farmbot_core/lib/farmbot_celery_script/corpus.ex +++ b/lib/celery/corpus.ex @@ -1,7 +1,7 @@ -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" + @corpus_file "fixtures/corpus.json" @external_resource @corpus_file %{"args" => args, "nodes" => nodes, "version" => tag} = @@ -110,9 +110,7 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.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/farmbot_celery_script/corpus/arg.ex b/lib/celery/corpus/arg.ex similarity index 84% rename from farmbot_core/lib/farmbot_celery_script/corpus/arg.ex rename to lib/celery/corpus/arg.ex index e291c301f..1f6d2cbd8 100644 --- a/farmbot_core/lib/farmbot_celery_script/corpus/arg.ex +++ b/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/lib/celery/corpus/node.ex similarity index 83% rename from farmbot_core/lib/farmbot_celery_script/corpus/node.ex rename to lib/celery/corpus/node.ex index 2cf5a4592..d4f59d034 100644 --- a/farmbot_core/lib/farmbot_celery_script/corpus/node.ex +++ b/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/lib/celery/dot_props.ex similarity index 91% rename from farmbot_core/lib/farmbot_celery_script/dot_props.ex rename to lib/celery/dot_props.ex index e927d3077..35e7a9cd6 100644 --- a/farmbot_core/lib/farmbot_celery_script/dot_props.ex +++ b/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/lib/celery/format_util.ex similarity index 92% rename from farmbot_core/lib/farmbot_celery_script/format_util.ex rename to lib/celery/format_util.ex index 25cfd4273..68132f18a 100644 --- a/farmbot_core/lib/farmbot_celery_script/format_util.ex +++ b/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/lib/celery/interpolation.ex b/lib/celery/interpolation.ex new file mode 100644 index 000000000..4ce8ffafb --- /dev/null +++ b/lib/celery/interpolation.ex @@ -0,0 +1,38 @@ +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 + 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() + + Float.round(dividend / divisor, 2) + end + end + + defp dist(from, to) do + x = :math.pow(to.x - from.x, 2) + y = :math.pow(to.y - from.y, 2) + :math.pow(x + y, 0.5) + 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) + end +end diff --git a/farmbot_core/lib/farmbot_celery_script/runtime_error.ex b/lib/celery/runtime_error.ex similarity index 79% rename from farmbot_core/lib/farmbot_celery_script/runtime_error.ex rename to lib/celery/runtime_error.ex index 45c47c7d0..c77235e4c 100644 --- a/farmbot_core/lib/farmbot_celery_script/runtime_error.ex +++ b/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/lib/celery/scheduler.ex similarity index 96% rename from farmbot_core/lib/farmbot_celery_script/scheduler.ex rename to lib/celery/scheduler.ex index bf136a054..a8cec9cc8 100644 --- a/farmbot_core/lib/farmbot_celery_script/scheduler.ex +++ b/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,14 +20,14 @@ 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 @grace_period_ms 900_000 defmodule Dispatch do - defstruct [ :scheduled_at, :data ] + defstruct [:scheduled_at, :data] end defstruct next: nil, @@ -174,7 +174,7 @@ defmodule FarmbotCeleryScript.Scheduler do ) do send( pid, - {FarmbotCeleryScript, + {FarmbotCore.Celery, {:scheduled_execution, scheduled_at, executed_at, result}} ) @@ -188,6 +188,7 @@ defmodule FarmbotCeleryScript.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) @@ -323,11 +324,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/lib/celery/special_value.ex similarity index 77% rename from farmbot_core/lib/farmbot_celery_script/special_value.ex rename to lib/celery/special_value.ex index 09283414c..145ff560b 100644 --- a/farmbot_core/lib/farmbot_celery_script/special_value.ex +++ b/lib/celery/special_value.ex @@ -1,18 +1,19 @@ -defmodule FarmbotCeleryScript.SpecialValue do - alias FarmbotCeleryScript.Interpolation - alias FarmbotCore.Asset.{ Repo, Point } +defmodule FarmbotCore.Celery.SpecialValue do + alias FarmbotCore.Celery.Interpolation + 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 FarmbotCeleryScript.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 FarmbotCeleryScript.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/farmbot_celery_script/step_runner.ex b/lib/celery/step_runner.ex similarity index 85% rename from farmbot_core/lib/farmbot_celery_script/step_runner.ex rename to lib/celery/step_runner.ex index 20e99b214..2fbb3cf1e 100644 --- a/farmbot_core/lib/farmbot_celery_script/step_runner.ex +++ b/lib/celery/step_runner.ex @@ -1,11 +1,12 @@ -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 """ Steps through an entire AST. """ @@ -48,7 +49,10 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.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/farmbot_celery_script/sys_calls.ex b/lib/celery/sys_call_glue.ex similarity index 97% rename from farmbot_core/lib/farmbot_celery_script/sys_calls.ex rename to lib/celery/sys_call_glue.ex index 9610afeda..e03f522cb 100644 --- a/farmbot_core/lib/farmbot_celery_script/sys_calls.ex +++ b/lib/celery/sys_call_glue.ex @@ -1,13 +1,13 @@ -defmodule FarmbotCeleryScript.SysCalls do +defmodule FarmbotCore.Celery.SysCallGlue 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 Application.get_env(:farmbot, __MODULE__)[:sys_calls] @sys_calls || Mix.raise(""" - config :farmbot_core, FarmbotCeleryScript.SysCalls, [ + config :farmbot, FarmbotCore.Celery.SysCallGlue, [ 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/lib/celery/sys_calls/stubs.ex similarity index 97% rename from farmbot_core/lib/farmbot_celery_script/sys_calls/stubs.ex rename to lib/celery/sys_calls/stubs.ex index fe41bede8..87e6e6fec 100644 --- a/farmbot_core/lib/farmbot_celery_script/sys_calls/stubs.ex +++ b/lib/celery/sys_calls/stubs.ex @@ -1,8 +1,8 @@ -defmodule FarmbotCeleryScript.SysCalls.Stubs do +defmodule FarmbotCore.Celery.SysCallGlue.Stubs do @moduledoc """ SysCall implementation that doesn't do anything. Useful for tests. """ - @behaviour FarmbotCeleryScript.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/lib/core/asset/repo.ex b/lib/core/asset/repo.ex new file mode 100644 index 000000000..0b408b87f --- /dev/null +++ b/lib/core/asset/repo.ex @@ -0,0 +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/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 76% rename from farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex rename to lib/core/asset_workers/device_worker.ex index 4668fee1a..a9dac028c 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/device_worker.ex +++ b/lib/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 @@ -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 8aaa617d5..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 - :httpc.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 65% rename from farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex rename to lib/core/asset_workers/peripheral_worker.ex index 8701dda6e..f0325b3eb 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/peripheral_worker.ex +++ b/lib/core/asset_workers/peripheral_worker.ex @@ -2,8 +2,8 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.Peripheral do use GenServer require Logger - alias FarmbotCore.{Asset.Peripheral, BotState} - alias FarmbotCeleryScript.AST + alias FarmbotCore.{Asset.Repo, Asset.Peripheral, BotState} + alias FarmbotCore.Celery.AST @retry_ms 1_000 @@ -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 FarmbotCeleryScript.execute(rpc, make_ref()) do + + 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 @@ -79,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/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex b/lib/core/asset_workers/pin_binding_worker.ex similarity index 63% rename from farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex rename to lib/core/asset_workers/pin_binding_worker.ex index cd449c757..a28c237c8 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/pin_binding_worker.ex +++ b/lib/core/asset_workers/pin_binding_worker.ex @@ -19,14 +19,14 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do Asset } - alias FarmbotCeleryScript.AST + alias FarmbotCore.Celery.AST @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, "#{inspect(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, "#{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}") @@ -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, "#{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}") @@ -103,8 +121,11 @@ 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 - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Power Off") + 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() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -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, "#{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}") @@ -124,20 +148,29 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do |> execute(state) end - def handle_cast(:trigger, %{pin_binding: %{special_action: "reboot"} = pin_binding} = state) do - FarmbotCore.Logger.info(1, "#{inspect(pin_binding)} triggered, executing Reboot") - FarmbotCeleryScript.SysCalls.reboot() + def handle_cast( + :trigger, + %{pin_binding: %{special_action: "reboot"} = pin_binding} = state + ) do + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Reboot") + FarmbotCore.Celery.SysCallGlue.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") - FarmbotCeleryScript.SysCalls.sync() + def handle_cast( + :trigger, + %{pin_binding: %{special_action: "sync"} = pin_binding} = state + ) do + FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Sync") + FarmbotCore.Celery.SysCallGlue.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") + 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() |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") @@ -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 -> @@ -178,18 +216,22 @@ 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 {: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 56% rename from farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex rename to lib/core/asset_workers/regimen_instance_worker.ex index 185cfcdf3..01df89f86 100644 --- a/farmbot_core/lib/farmbot_core/asset_workers/regimen_instance_worker.ex +++ b/lib/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} @@ -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({FarmbotCeleryScript, {: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,19 +102,28 @@ 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} - FarmbotCeleryScript.schedule(celery_ast, at, sequence) + FarmbotCore.Celery.schedule(celery_ast, at, sequence) end end 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 292b6acf3..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 @@ -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 @@ -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 @@ -262,9 +288,10 @@ 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}, + {: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 87% rename from farmbot_core/lib/farmbot_core/firmware_estop_timer.ex rename to lib/core/firmware_estop_timer.ex index e2f63fc30..ea60507f7 100644 --- a/farmbot_core/lib/farmbot_core/firmware_estop_timer.ex +++ b/lib/core/firmware_estop_timer.ex @@ -9,7 +9,6 @@ defmodule FarmbotCore.FirmwareEstopTimer do require FarmbotCore.Logger @msg "Farmbot has been E-Stopped for more than 10 minutes." - @ten_minutes_ms 60_0000 def start_timer(timer_server \\ __MODULE__) do @@ -39,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 @@ -53,6 +53,7 @@ defmodule FarmbotCore.FirmwareEstopTimer do {:noreply, %{state | timer: nil}, :hibernate} end - @doc false - def do_log, do: FarmbotCore.Logger.warn(1, @msg, channels: [:fatal_email]) + 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/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 91% rename from farmbot_ext/lib/farmbot_ext/api/reconciler.ex rename to lib/ext/api/reconciler.ex index fdabf7968..7948a171d 100644 --- a/farmbot_ext/lib/farmbot_ext/api/reconciler.ex +++ b/lib/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] @@ -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 82% rename from farmbot_ext/lib/farmbot_ext/api_fetcher.ex rename to lib/ext/api_fetcher.ex index c53ea47a7..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,10 +53,13 @@ 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} ()" - Tesla.client([ + middleware = [ {Tesla.Middleware.BaseUrl, url}, {Tesla.Middleware.Headers, [ @@ -63,7 +67,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 @@ -71,20 +77,25 @@ 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, []} - ]) + ] + + Tesla.client(middleware, adapter()) end 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) @@ -135,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 @@ -184,4 +215,9 @@ 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/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 d10e8dda8..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) - FarmbotCeleryScript.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 bc98e4538..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 = FarmbotExt.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 80% rename from farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex rename to lib/ext/bootstrap/supervisor.ex index 0ac70331c..efa9d9a42 100644 --- a/farmbot_ext/lib/farmbot_ext/bootstrap/supervisor.ex +++ b/lib/ext/bootstrap/supervisor.ex @@ -16,11 +16,11 @@ 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.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/lib/ext/dirty_worker.ex similarity index 95% rename from farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex rename to lib/ext/dirty_worker.ex index cca248a91..0709a968d 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker.ex +++ b/lib/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.SysCallGlue.sync() FarmbotExt.Time.sleep(timeout * 10) true end @@ -177,11 +177,11 @@ defmodule FarmbotExt.API.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/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex b/lib/ext/dirty_worker/supervisor.ex similarity index 81% rename from farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex rename to lib/ext/dirty_worker/supervisor.ex index 27e1e49cd..ae4f95f1c 100644 --- a/farmbot_ext/lib/farmbot_ext/api/dirty_worker/supervisor.ex +++ b/lib/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, @@ -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 @@ -36,7 +36,7 @@ defmodule FarmbotExt.API.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/api/eager_loader.ex b/lib/ext/eager_loader.ex similarity index 88% rename from farmbot_ext/lib/farmbot_ext/api/eager_loader.ex rename to lib/ext/eager_loader.ex index b8950d831..caf913b91 100644 --- a/farmbot_ext/lib/farmbot_ext/api/eager_loader.ex +++ b/lib/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 @@ -49,7 +50,9 @@ defmodule FarmbotExt.API.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 @@ -74,8 +77,15 @@ defmodule FarmbotExt.API.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/api/eager_loader/supervisor.ex b/lib/ext/eager_loader/supervisor.ex similarity index 84% rename from farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex rename to lib/ext/eager_loader/supervisor.ex index 086b77fa4..02460d510 100644 --- a/farmbot_ext/lib/farmbot_ext/api/eager_loader/supervisor.ex +++ b/lib/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,8 @@ 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 @@ -43,7 +44,7 @@ defmodule FarmbotExt.API.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 82% rename from farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex rename to lib/ext/mqtt/mqtt.ex index b1f226b74..f655a8414 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/mqtt.ex +++ b/lib/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/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 95% rename from farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex rename to lib/ext/mqtt/rpc_handler.ex index f5995e233..aa3b5f81b 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/rpc_handler.ex +++ b/lib/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/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 88% rename from farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex rename to lib/ext/mqtt/sync_handler_support.ex index a462a95e7..f1fafe46d 100644 --- a/farmbot_ext/lib/farmbot_ext/mqtt/sync_handler_support.ex +++ b/lib/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 @@ -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 96% rename from farmbot_core/lib/firmware/gcode_decoder.ex rename to lib/firmware/gcode_decoder.ex index 2f3d85841..7847a2ac3 100644 --- a/farmbot_core/lib/firmware/gcode_decoder.ex +++ b/lib/firmware/gcode_decoder.ex @@ -66,6 +66,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 +74,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)}" + Logger.debug(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 99% rename from farmbot_core/lib/firmware/inbound_side_effects.ex rename to lib/firmware/inbound_side_effects.ex index 357a9d3cc..3103bfb21 100644 --- a/farmbot_core/lib/firmware/inbound_side_effects.ex +++ b/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/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 57% rename from farmbot_core/lib/firmware/rx_buffer.ex rename to lib/firmware/rx_buffer.ex index 4bea42677..43bccb361 100644 --- a/farmbot_core/lib/firmware/rx_buffer.ex +++ b/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/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 98% rename from farmbot_core/lib/firmware/uart_core.ex rename to lib/firmware/uart_core.ex index ffaa1fc25..4e14962ca 100644 --- a/farmbot_core/lib/firmware/uart_core.ex +++ b/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/lib/firmware/uart_core_support.ex similarity index 88% rename from farmbot_core/lib/firmware/uart_core_support.ex rename to lib/firmware/uart_core_support.ex index be3982fab..774520cc8 100644 --- a/farmbot_core/lib/firmware/uart_core_support.ex +++ b/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/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_socket/logger_backend.ex b/lib/os/configurator/logger_backend.ex similarity index 94% rename from farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex rename to lib/os/configurator/logger_backend.ex index 302ece5be..0e1534bb0 100644 --- a/farmbot_os/lib/farmbot_os/configurator/logger_socket/logger_backend.ex +++ b/lib/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/lib/os/configurator/logger_socket.ex similarity index 96% rename from farmbot_os/lib/farmbot_os/configurator/logger_socket.ex rename to lib/os/configurator/logger_socket.ex index 86ee38352..bd6dc8650 100644 --- a/farmbot_os/lib/farmbot_os/configurator/logger_socket.ex +++ b/lib/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/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 99% rename from farmbot_os/lib/farmbot_os/configurator/router.ex rename to lib/os/configurator/router.ex index fb2ab2d09..59411ca75 100644 --- a/farmbot_os/lib/farmbot_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/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 93% rename from farmbot_os/lib/farmbot_os/lua.ex rename to lib/os/lua.ex index d71642570..3d176a4bb 100644 --- a/farmbot_os/lib/farmbot_os/lua.ex +++ b/lib/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, @@ -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} @@ -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} @@ -147,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/ext/data_manipulation.ex b/lib/os/lua/data_manipulation.ex similarity index 97% rename from farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex rename to lib/os/lua/data_manipulation.ex index 90cdaf117..48a2d25b6 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/data_manipulation.ex +++ b/lib/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 """ @@ -7,8 +7,8 @@ defmodule FarmbotOS.Lua.Ext.DataManipulation do alias FarmbotCore.Asset.{Device, FbosConfig, FirmwareConfig} alias FarmbotOS.Lua.Util alias FarmbotOS.SysCalls.ResourceUpdate - alias FarmbotExt.HTTP - alias FarmbotCeleryScript.SpecialValue + alias FarmbotOS.HTTP + alias FarmbotCore.Celery.SpecialValue @methods %{ "connect" => :connect, diff --git a/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex b/lib/os/lua/firmware.ex similarity index 78% rename from farmbot_os/lib/farmbot_os/lua/ext/firmware.ex rename to lib/os/lua/firmware.ex index 95771fc61..393caf2db 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/firmware.ex +++ b/lib/os/lua/firmware.ex @@ -1,14 +1,14 @@ -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.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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/ext/info.ex b/lib/os/lua/info.ex similarity index 94% rename from farmbot_os/lib/farmbot_os/lua/ext/info.ex rename to lib/os/lua/info.ex index 06f5dbcd8..1be6e589a 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/info.ex +++ b/lib/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.SysCallGlue alias FarmbotOS.Lua.Util alias FarmbotCore.Config @@ -94,7 +94,7 @@ defmodule FarmbotOS.Lua.Ext.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/ext/wait.ex b/lib/os/lua/wait.ex similarity index 61% rename from farmbot_os/lib/farmbot_os/lua/ext/wait.ex rename to lib/os/lua/wait.ex index d36337e48..0a13bc5a5 100644 --- a/farmbot_os/lib/farmbot_os/lua/ext/wait.ex +++ b/lib/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.SysCallGlue @three_minutes 60 * 1000 * 3 @error "Do not use sleep for longer than three minutes." @@ -11,8 +11,8 @@ defmodule FarmbotOS.Lua.Ext.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 97% rename from farmbot_os/lib/farmbot_os/sys_calls.ex rename to lib/os/sys_calls.ex index bc56eb09f..b6fee83bb 100644 --- a/farmbot_os/lib/farmbot_os/sys_calls.ex +++ b/lib/os/sys_calls.ex @@ -1,13 +1,13 @@ defmodule FarmbotOS.SysCalls do @moduledoc """ - Implementation for FarmbotCeleryScript.SysCalls + Implementation for FarmbotCore.Celery.SysCallGlue """ 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.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 b2868094d..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) - FarmbotCeleryScript.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 83% rename from farmbot_os/lib/farmbot_os/sys_calls/send_message.ex rename to lib/os/sys_calls/send_message.ex index f0d0211b3..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" @@ -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/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 77% rename from farmbot_os/lib/farmbot_os/system.ex rename to lib/os/system.ex index 45f84f4e5..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 @@ -74,7 +62,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/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 17f3861a8..393d5d233 100644 --- a/farmbot_os/lib/farmbot_os/update_support.ex +++ b/lib/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} = + FarmbotOS.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) + # 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 @@ -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 = 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/lib/telemetry/http.ex b/lib/telemetry/http.ex new file mode 100644 index 000000000..fb2219a9c --- /dev/null +++ b/lib/telemetry/http.ex @@ -0,0 +1,24 @@ +defmodule FarmbotOS.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/mix.exs b/mix.exs index fcf6b461a..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.2", 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 f2319faeb..0f9e9a75d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,21 +1,108 @@ %{ - "certifi": {:hex, :certifi, "2.6.1", "dbab8e5e155a0763eea978c913ca280a6b544bfa115633fa20249c3d396d9493", [:rebar3], [], "hexpm", "524c97b4991b3849dd5c17a631223896272c6b0af446778ba4675a1dff53bb7e"}, - "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"}, - "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"}, + "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"}, + "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/rootfs_overlay/farmware/test.txt b/rootfs_overlay/farmware/test.txt new file mode 100644 index 000000000..8f214dd3d --- /dev/null +++ b/rootfs_overlay/farmware/test.txt @@ -0,0 +1 @@ +Test123 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 5cb56c5e6..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 -mix format +echo "######### Fetch Deps" mix deps.get --all -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_ENV=test mix compile --force -mix coveralls.html -rm -f *.coverdata -echo "######### farmbot_ext" -cd ../farmbot_ext -mix format -mix deps.get --all -MIX_ENV=test mix compile --force +echo "######### Run Tests" mix coveralls.html rm -f *.coverdata -echo "######### farmbot_os" -cd ../farmbot_os -mix format -mix deps.get --all -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 a13301224..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 FarmbotCeleryScript.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/test/asset_workers/farm_event_worker/sequence_event_test.exs b/test/asset_workers/farm_event_worker/sequence_event_test.exs new file mode 100644 index 000000000..903835bbd --- /dev/null +++ b/test/asset_workers/farm_event_worker/sequence_event_test.exs @@ -0,0 +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/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/farmbot_core/test/asset_workers/pin_binding_worker_test.exs b/test/asset_workers/pin_binding_worker_test.exs similarity index 50% rename from farmbot_core/test/asset_workers/pin_binding_worker_test.exs rename to test/asset_workers/pin_binding_worker_test.exs index 84d544e09..b3d665c01 100644 --- a/farmbot_core/test/asset_workers/pin_binding_worker_test.exs +++ b/test/asset_workers/pin_binding_worker_test.exs @@ -8,14 +8,26 @@ 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}} - expect(FarmbotCeleryScript.SysCalls, :reboot, fn -> :ok end) + params = %{ + pin_binding: %FarmbotCore.Asset.PinBinding{ + special_action: "reboot", + pin_num: 0 + } + } + + expect(FarmbotCore.Celery.SysCallGlue, :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}} - expect(FarmbotCeleryScript.SysCalls, :sync, fn -> :ok end) + params = %{ + pin_binding: %FarmbotCore.Asset.PinBinding{ + special_action: "sync", + pin_num: 0 + } + } + + 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 82% rename from farmbot_core/test/asset_workers/regimen_instance_worker_test.exs rename to test/asset_workers/regimen_instance_worker_test.exs index 5c20e9c91..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 = @@ -19,7 +20,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/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/test/bot_state/job_progress_test.exs b/test/bot_state/job_progress_test.exs new file mode 100644 index 000000000..115bf64cb --- /dev/null +++ b/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_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/test/config_storage/string_value_test.exs b/test/config_storage/string_value_test.exs new file mode 100644 index 000000000..ac78e736e --- /dev/null +++ b/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/test/dot_props_test.exs b/test/dot_props_test.exs new file mode 100644 index 000000000..373560405 --- /dev/null +++ b/test/dot_props_test.exs @@ -0,0 +1,4 @@ +defmodule FarmbotCore.Celery.DotPropsTest do + use ExUnit.Case + doctest FarmbotCore.Celery.DotProps, import: true +end diff --git a/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs b/test/farmbot_celery_script/assertion_compiler_test.exs similarity index 71% rename from farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs rename to test/farmbot_celery_script/assertion_compiler_test.exs index 6191afa36..f78755de0 100644 --- a/farmbot_core/test/farmbot_celery_script/assertion_compiler_test.exs +++ b/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.SysCallGlue, :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/test/farmbot_celery_script/ast/factory_test.exs b/test/farmbot_celery_script/ast/factory_test.exs new file mode 100644 index 000000000..53895a1f0 --- /dev/null +++ b/test/farmbot_celery_script/ast/factory_test.exs @@ -0,0 +1,4 @@ +defmodule FarmbotCore.Celery.AST.FactoryTest do + use ExUnit.Case + doctest FarmbotCore.Celery.AST.Factory, import: true +end diff --git a/farmbot_core/test/farmbot_celery_script/ast_test.exs b/test/farmbot_celery_script/ast_test.exs similarity index 95% rename from farmbot_core/test/farmbot_celery_script/ast_test.exs rename to test/farmbot_celery_script/ast_test.exs index 19a5e7df4..ab5b19a75 100644 --- a/farmbot_core/test/farmbot_celery_script/ast_test.exs +++ b/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/test/farmbot_celery_script/compiler_groups_test.exs similarity index 70% rename from farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs rename to test/farmbot_celery_script/compiler_groups_test.exs index e94074cbb..a76d322da 100644 --- a/farmbot_core/test/farmbot_celery_script/compiler_groups_test.exs +++ b/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.SysCallGlue, :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.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 73% rename from farmbot_core/test/farmbot_celery_script/compiler_test.exs rename to test/farmbot_celery_script/compiler_test.exs index 5a2cc9fd8..20b47af25 100644 --- a/farmbot_core/test/farmbot_celery_script/compiler_test.exs +++ b/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.SysCallGlue, 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.SysCallGlue, :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.SysCallGlue, :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.SysCallGlue.log(\"Taking photo\", true) + FarmbotCore.Celery.SysCallGlue.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.SysCallGlue.set_user_env("a", "123") + FarmbotCore.Celery.SysCallGlue.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.SysCallGlue.log("Installing dependencies...") + FarmbotCore.Celery.SysCallGlue.install_first_party_farmware() """) end @@ -164,17 +164,17 @@ defmodule FarmbotCeleryScript.CompilerTest do assert compiled == strip_nl(""" - FarmbotCeleryScript.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 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.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,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.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 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.SysCallGlue.log("Moving relative to (\#{x_str}, \#{y_str}, \#{z_str})", true) + FarmbotCore.Celery.SysCallGlue.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.SysCallGlue.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.SysCallGlue.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.SysCallGlue.log("Writing servo: \#{pin}: \#{angle}") + FarmbotCore.Celery.SysCallGlue.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.SysCallGlue.log("Setting pin mode: \#{pin}: \#{mode}") + FarmbotCore.Celery.SysCallGlue.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/test/farmbot_celery_script/compilers/pin_control_compilers_test.exs similarity index 57% 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 ca7af3e38..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 @@ -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.SysCallGlue, :read_pin, fn pin, mode -> assert pin == 1 assert mode == 0 :ok end) - expect(FarmbotCeleryScript.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 59% rename from farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs rename to test/farmbot_celery_script/corpus/arg_test.exs index f15ff82e3..4a3938bcb 100644 --- a/farmbot_core/test/farmbot_celery_script/corpus/arg_test.exs +++ b/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/test/farmbot_celery_script/corpus/node_test.exs similarity index 87% rename from farmbot_core/test/farmbot_celery_script/corpus/node_test.exs rename to test/farmbot_celery_script/corpus/node_test.exs index ca90cc881..447cf60c4 100644 --- a/farmbot_core/test/farmbot_celery_script/corpus/node_test.exs +++ b/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/test/farmbot_celery_script/corpus_test.exs similarity index 90% rename from farmbot_core/test/farmbot_celery_script/corpus_test.exs rename to test/farmbot_celery_script/corpus_test.exs index 18dd116b5..5fa83f7a6 100644 --- a/farmbot_core/test/farmbot_celery_script/corpus_test.exs +++ b/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/test/farmbot_celery_script/integration_test.exs similarity index 52% rename from farmbot_core/test/farmbot_celery_script/integration_test.exs rename to test/farmbot_celery_script/integration_test.exs index 1a3a6aa45..24cfda7e8 100644 --- a/farmbot_core/test/farmbot_celery_script/integration_test.exs +++ b/test/farmbot_celery_script/integration_test.exs @@ -1,34 +1,34 @@ # 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! @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(FarmbotCeleryScript.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(FarmbotCeleryScript.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/test/farmbot_celery_script/lua_compiler_test.exs b/test/farmbot_celery_script/lua_compiler_test.exs new file mode 100644 index 000000000..b48281f09 --- /dev/null +++ b/test/farmbot_celery_script/lua_compiler_test.exs @@ -0,0 +1,33 @@ +defmodule FarmbotCore.Celery.LuaTest do + use ExUnit.Case + 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: %{ + "parent" => %{x: 1, y: 2, z: 3}, + "nachos" => %{x: 4, y: 5, z: 6} + } + } + + result = Lua.do_lua("variables.parent.x", cs_scope) + expected = {:error, "CeleryScript syscall stubbed: perform_lua\n"} + assert result == expected + end +end diff --git a/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs b/test/farmbot_celery_script/move_compiler_test.exs similarity index 97% rename from farmbot_core/test/farmbot_celery_script/move_compiler_test.exs rename to test/farmbot_celery_script/move_compiler_test.exs index bc358e67f..d34f01511 100644 --- a/farmbot_core/test/farmbot_celery_script/move_compiler_test.exs +++ b/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 + SysCallGlue.Stubs } - alias FarmbotCeleryScript.SysCalls, warn: false + # alias FarmbotCore.Celery.SysCallGlue 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/test/farmbot_celery_script/scheduler_test.exs similarity index 78% rename from farmbot_core/test/farmbot_celery_script/scheduler_test.exs rename to test/farmbot_celery_script/scheduler_test.exs index 3d5ce6ab9..1f8a5cb20 100644 --- a/farmbot_core/test/farmbot_celery_script/scheduler_test.exs +++ b/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.SysCallGlue.Stubs import ExUnit.CaptureLog setup :set_mimic_global @@ -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_core/test/farmbot_celery_script/scope_test.exs b/test/farmbot_celery_script/scope_test.exs similarity index 96% rename from farmbot_core/test/farmbot_celery_script/scope_test.exs rename to test/farmbot_celery_script/scope_test.exs index 1b41d9463..e032783b6 100644 --- a/farmbot_core/test/farmbot_celery_script/scope_test.exs +++ b/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/test/farmbot_celery_script/special_value_test.exs similarity index 87% rename from farmbot_core/test/farmbot_celery_script/special_value_test.exs rename to test/farmbot_celery_script/special_value_test.exs index adb6fa0c1..101124dd1 100644 --- a/farmbot_core/test/farmbot_celery_script/special_value_test.exs +++ b/test/farmbot_celery_script/special_value_test.exs @@ -1,25 +1,21 @@ -defmodule FarmbotCeleryScript.SpecialValueTest do +defmodule FarmbotCore.Celery.SpecialValueTest do use ExUnit.Case use Mimic - alias FarmbotCeleryScript.SpecialValue - import ExUnit.CaptureLog + alias FarmbotCore.Celery.SpecialValue + 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 59% rename from farmbot_core/test/farmbot_celery_script/sys_calls_test.exs rename to test/farmbot_celery_script/sys_call_glue_test.exs index 0f83c55f8..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 FarmbotCeleryScript.SysCallsTest do +defmodule FarmbotCore.Celery.SysCallGlueTest do use ExUnit.Case, async: false use Mimic - alias FarmbotCeleryScript.{ - SysCalls, - SysCalls.Stubs, + alias FarmbotCore.Celery.{ + SysCallGlue, + SysCallGlue.Stubs, AST } @@ -15,7 +15,7 @@ defmodule FarmbotCeleryScript.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,8 +24,8 @@ defmodule FarmbotCeleryScript.SysCallsTest do :whatever end) - boom = fn -> SysCalls.point(Stubs, "Peripheral", 0) end - assert_raise FarmbotCeleryScript.RuntimeError, boom + boom = fn -> SysCallGlue.point(Stubs, "Peripheral", 0) end + assert_raise FarmbotCore.Celery.RuntimeError, boom end test "point groups failure" do @@ -33,8 +33,8 @@ defmodule FarmbotCeleryScript.SysCallsTest do :whatever end) - boom = fn -> SysCalls.find_points_via_group(Stubs, :something_else) end - assert_raise FarmbotCeleryScript.RuntimeError, boom + boom = fn -> SysCallGlue.find_points_via_group(Stubs, :something_else) end + assert_raise FarmbotCore.Celery.RuntimeError, boom end test "point groups success" do @@ -43,7 +43,7 @@ defmodule FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 FarmbotCeleryScript.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 88% rename from farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs rename to test/farmbot_celery_script/variable_transformer_test.exs index abb9b6e62..a46fc56cc 100644 --- a/farmbot_core/test/farmbot_celery_script/variable_transformer_test.exs +++ b/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.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 81% rename from farmbot_core/test/farmbot_celery_script_test.exs rename to test/farmbot_celery_script_test.exs index 583e661db..0b2b233ef 100644 --- a/farmbot_core/test/farmbot_celery_script_test.exs +++ b/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.SysCallGlue.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_ext/test/farmbot_ext/api/dirty_worker_test.exs b/test/farmbot_ext/api/dirty_worker_test.exs similarity index 70% rename from farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs rename to test/farmbot_ext/api/dirty_worker_test.exs index a3478c995..d395edf43 100644 --- a/farmbot_ext/test/farmbot_ext/api/dirty_worker_test.exs +++ b/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,14 +12,24 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Repo } - alias FarmbotExt.API.DirtyWorker + alias FarmbotExt.DirtyWorker.Supervisor + + alias FarmbotExt.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} - 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 @@ -31,13 +41,23 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Private.mark_stale!(p) assert Private.any_stale?() - expect(FarmbotCeleryScript.SysCalls, :sync, 1, fn -> + expect(FarmbotCore.Celery.SysCallGlue, :sync, 1, fn -> Private.mark_clean!(p) end) 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) @@ -48,7 +68,7 @@ defmodule FarmbotExt.API.DirtyWorkerTest do |> FbosConfig.changeset() |> Repo.insert!() - expect(FarmbotCeleryScript.SysCalls, :sync, 1, fn -> + expect(FarmbotCore.Celery.SysCallGlue, :sync, 1, fn -> "I expect a 409 response to trigger a sync." end) @@ -63,7 +83,7 @@ defmodule FarmbotExt.API.DirtyWorkerTest do Helpers.delete_all_points() Repo.delete_all(LocalMeta) - stub(FarmbotCeleryScript.SysCalls, :sync, fn -> + stub(FarmbotCore.Celery.SysCallGlue, :sync, fn -> flunk("Never should call sync") end) @@ -96,25 +116,4 @@ defmodule FarmbotExt.API.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/farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs b/test/farmbot_ext/api/eager_loader_supervisor_test.exs similarity index 57% rename from farmbot_ext/test/farmbot_ext/api/eager_loader_supervisor_test.exs rename to 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/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/test/farmbot_ext/api/eager_loader_test.exs similarity index 58% rename from farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs rename to test/farmbot_ext/api/eager_loader_test.exs index 1ee9219d2..9dc6d78e6 100644 --- a/farmbot_ext/test/farmbot_ext/api/eager_loader_test.exs +++ b/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 } @@ -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_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 52b67b146..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(FarmbotExt.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 6f7efcf5c..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(FarmbotCeleryScript.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 77% rename from farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs rename to test/farmbot_ext/mqtt/mqtt_test.exs index 30e27e0e2..d12972d55 100644 --- a/farmbot_ext/test/farmbot_ext/mqtt/mqtt_test.exs +++ b/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/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 95% 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 1cf34471e..7bef72972 100644 --- a/farmbot_ext/test/farmbot_ext/mqtt/sync_handler_support_test.exs +++ b/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", @@ -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 97% 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 bb060ca39..951e87890 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/data_manipulation_test.exs +++ b/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 @@ -307,7 +307,7 @@ defmodule FarmbotOS.Lua.Ext.DataManipulationTest do end test "http" do - expect(FarmbotExt.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 72% rename from farmbot_os/test/farmbot_os/lua/ext/firmware_test.exs rename to test/farmbot_os/lua/ext/firmware_test.exs index 121782447..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.Ext.FirmwareTest do - alias FarmbotOS.Lua.Ext.Firmware - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotOS.Lua.FirmwareTest do + alias FarmbotOS.Lua.Firmware + alias FarmbotCore.Celery.SysCallGlue use ExUnit.Case use Mimic setup :verify_on_exit! @@ -9,7 +9,7 @@ defmodule FarmbotOS.Lua.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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.Ext.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 97% rename from farmbot_os/test/farmbot_os/lua/ext/info_test.exs rename to test/farmbot_os/lua/ext/info_test.exs index 9acdcee12..87cffced2 100644 --- a/farmbot_os/test/farmbot_os/lua/ext/info_test.exs +++ b/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/test/farmbot_os/lua/ext/wait_test.exs similarity index 65% rename from farmbot_os/test/farmbot_os/lua/ext/wait_test.exs rename to test/farmbot_os/lua/ext/wait_test.exs index 48744430d..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.Ext.WaitTest do - alias FarmbotOS.Lua.Ext.Wait - alias FarmbotCeleryScript.SysCalls +defmodule FarmbotOS.Lua.WaitTest do + alias FarmbotOS.Lua.Wait + alias FarmbotCore.Celery.SysCallGlue use ExUnit.Case use Mimic @@ -9,9 +9,9 @@ defmodule FarmbotOS.Lua.Ext.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 8909a2356..83ecaea80 100644 --- a/farmbot_os/test/farmbot_os/lua_test.exs +++ b/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 @@ -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 = - FarmbotCeleryScript.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 4bac37928..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(FarmbotCeleryScript.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/test/farmbot_telemetry_test.exs b/test/farmbot_telemetry_test.exs new file mode 100644 index 000000000..7b7368f28 --- /dev/null +++ b/test/farmbot_telemetry_test.exs @@ -0,0 +1,46 @@ +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, :event, :test_subsystem], + %{measurement: :measurement, value: 1.0}, _meta, _config} + end + + test "assigns meta" do + :ok = FarmbotTelemetry.attach_recv(:event, :test_subsystem, self()) + + :ok = + FarmbotTelemetry.event(:test_subsystem, :measurement, 1.0, hello: "world") + + assert_receive {[:farmbot, :event, :test_subsystem], + %{measurement: :measurement, value: 1.0}, meta, _config} + + assert meta[:hello] == "world" + end + + 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_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_test.exs similarity index 100% rename from farmbot_core/test/firmware/estop_timer.exs rename to test/firmware/estop_timer_test.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/test/firmware/rx_buffer_test.exs b/test/firmware/rx_buffer_test.exs new file mode 100644 index 000000000..377f6782b --- /dev/null +++ b/test/firmware/rx_buffer_test.exs @@ -0,0 +1,5 @@ +defmodule FarmbotCore.Firmware.RxBufferTest do + use ExUnit.Case + alias FarmbotCore.Firmware.RxBuffer + doctest FarmbotCore.Firmware.RxBuffer, import: true +end diff --git a/farmbot_core/test/firmware/tx_buffer_test.exs b/test/firmware/tx_buffer_test.exs similarity index 98% rename from farmbot_core/test/firmware/tx_buffer_test.exs rename to test/firmware/tx_buffer_test.exs index b57ba2639..2d9f91b1c 100644 --- a/farmbot_core/test/firmware/tx_buffer_test.exs +++ b/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_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 74% rename from farmbot_core/test/firmware/uart_core_test.exs rename to test/firmware/uart_core_test.exs index 9b1f8fddd..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 @@ -72,27 +69,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 @@ -147,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 @@ -180,9 +153,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_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/test/http_test.exs b/test/http_test.exs new file mode 100644 index 000000000..7d09dd4a2 --- /dev/null +++ b/test/http_test.exs @@ -0,0 +1,27 @@ +defmodule FarmbotOS.HTTPTest do + use ExUnit.Case + doctest FarmbotOS.HTTP + alias FarmbotOS.HTTP + + def get(url) do + FarmbotOS.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 - 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 88% rename from farmbot_core/test/interpolation_test.exs rename to test/interpolation_test.exs index c63df4005..3958a1fb1 100644 --- a/farmbot_core/test/interpolation_test.exs +++ b/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/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 d757ae432..ff91ff890 100644 --- a/farmbot_core/test/stub_test.exs +++ b/test/stub_test.exs @@ -1,6 +1,6 @@ -defmodule FarmbotCeleryScript.SysCalls.StubsTest do +defmodule FarmbotCore.Celery.SysCallGlue.StubsTest do use ExUnit.Case - alias FarmbotCeleryScript.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..b6ab16735 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,222 @@ 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.AST.Factory, + 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"