diff --git a/farmbot_celery_script/lib/farmbot_celery_script/compiler.ex b/farmbot_celery_script/lib/farmbot_celery_script/compiler.ex index eaa40171..f34f8425 100644 --- a/farmbot_celery_script/lib/farmbot_celery_script/compiler.ex +++ b/farmbot_celery_script/lib/farmbot_celery_script/compiler.ex @@ -105,7 +105,7 @@ defmodule FarmbotCeleryScript.Compiler do defdelegate named_pin(ast, env), to: Compiler.DataControl defdelegate point(ast, env), to: Compiler.DataControl defdelegate read_pin(ast, env), to: Compiler.PinControl - defdelegate resource_update(ast, env), to: Compiler.DataControl + defdelegate update_resource(ast, env), to: Compiler.UpdateResource defdelegate rpc_request(ast, env), to: Compiler.RPCRequest defdelegate sequence(ast, env), to: Compiler.Sequence defdelegate set_pin_io_mode(ast, env), to: Compiler.PinControl diff --git a/farmbot_celery_script/lib/farmbot_celery_script/compilers/data_control_compiler.ex b/farmbot_celery_script/lib/farmbot_celery_script/compilers/data_control_compiler.ex deleted file mode 100644 index d95a0457..00000000 --- a/farmbot_celery_script/lib/farmbot_celery_script/compilers/data_control_compiler.ex +++ /dev/null @@ -1,74 +0,0 @@ -defmodule FarmbotCeleryScript.Compiler.DataControl do - alias FarmbotCeleryScript.Compiler - - # compiles coordinate - # Coordinate should return a vec3 - def coordinate(%{args: %{x: x, y: y, z: z}}, env) do - quote location: :keep do - FarmbotCeleryScript.SysCalls.coordinate( - unquote(Compiler.compile_ast(x, env)), - unquote(Compiler.compile_ast(y, env)), - unquote(Compiler.compile_ast(z, env)) - ) - end - end - - # compiles point - def point(%{args: %{pointer_type: type, pointer_id: id}}, env) do - quote location: :keep do - FarmbotCeleryScript.SysCalls.point( - unquote(Compiler.compile_ast(type, env)), - unquote(Compiler.compile_ast(id, env)) - ) - end - end - - # compile a named pin - def named_pin(%{args: %{pin_id: id, pin_type: type}}, env) do - quote location: :keep do - FarmbotCeleryScript.SysCalls.named_pin( - unquote(Compiler.compile_ast(type, env)), - unquote(Compiler.compile_ast(id, env)) - ) - end - end - - def tool(%{args: %{tool_id: tool_id}}, env) do - quote location: :keep do - FarmbotCeleryScript.SysCalls.get_toolslot_for_tool( - unquote(Compiler.compile_ast(tool_id, env)) - ) - end - end - - def resource_update( - %{ - args: %{ - resource_type: kind, - resource_id: id, - label: label, - value: value - }, - body: body - }, - env - ) do - initial = %{label => value} - # Technically now body isn't supported by this node. - extra = - Map.new(body, fn %{args: %{label: label, data_value: value}} -> - {label, value} - end) - - # Make sure the initial stuff higher most priority - params = Map.merge(extra, initial) - - quote do - FarmbotCeleryScript.SysCalls.resource_update( - unquote(Compiler.compile_ast(kind, env)), - unquote(Compiler.compile_ast(id, env)), - unquote(Macro.escape(params)) - ) - end - end -end diff --git a/farmbot_celery_script/lib/farmbot_celery_script/compilers/update_resource_compiler.ex b/farmbot_celery_script/lib/farmbot_celery_script/compilers/update_resource_compiler.ex new file mode 100644 index 00000000..9528b3f3 --- /dev/null +++ b/farmbot_celery_script/lib/farmbot_celery_script/compilers/update_resource_compiler.ex @@ -0,0 +1,31 @@ +defmodule FarmbotCeleryScript.Compiler.UpdateResource do + # alias FarmbotCeleryScript.Compiler + + def coordinate(_ast, _env) do + raise "TODO: coordinate" + end + + def named_pin(_ast, _env) do + raise "TODO: named_pin" + end + + def point(_ast, _env) do + raise "TODO: point" + end + + def tool(_ast, _env) do + raise "TODO: tool" + end + + def update_resource(_ast, _env) do + raise "Its here!" + + quote do + # FarmbotCeleryScript.SysCalls.update_resource( + # unquote(Compiler.compile_ast(kind, env)), + # unquote(Compiler.compile_ast(id, env)), + # unquote(Macro.escape(params)) + # ) + end + end +end diff --git a/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex b/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex index 6ecf0055..ab8bbdf5 100644 --- a/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex +++ b/farmbot_celery_script/lib/farmbot_celery_script/sys_calls.ex @@ -69,7 +69,6 @@ defmodule FarmbotCeleryScript.SysCalls do @callback toggle_pin(pin_num :: number()) :: ok_or_error @callback read_status() :: ok_or_error @callback reboot() :: ok_or_error - @callback resource_update(String.t(), resource_id, map()) :: ok_or_error @callback send_message(type :: String.t(), message :: String.t(), [atom]) :: ok_or_error @callback set_servo_angle(pin :: number(), value :: number()) :: ok_or_error @@ -297,10 +296,6 @@ defmodule FarmbotCeleryScript.SysCalls do ok_or_error(sys_calls, :reboot, []) end - def resource_update(sys_calls \\ @sys_calls, kind, id, params) do - ok_or_error(sys_calls, :resource_update, [kind, id, params]) - end - def send_message(sys_calls \\ @sys_calls, kind, msg, channels) do ok_or_error(sys_calls, :send_message, [kind, msg, channels]) end diff --git a/farmbot_celery_script/lib/farmbot_celery_script/sys_calls/stubs.ex b/farmbot_celery_script/lib/farmbot_celery_script/sys_calls/stubs.ex index d6e70b8a..02232b90 100644 --- a/farmbot_celery_script/lib/farmbot_celery_script/sys_calls/stubs.ex +++ b/farmbot_celery_script/lib/farmbot_celery_script/sys_calls/stubs.ex @@ -119,10 +119,6 @@ defmodule FarmbotCeleryScript.SysCalls.Stubs do @impl true def reboot(), do: error(:reboot, []) - @impl true - def resource_update(kind, resource_id, data), - do: error(:resource_update, [kind, resource_id, data]) - @impl true def send_message(type, message, channels), do: error(:send_message, [type, message, channels]) diff --git a/farmbot_celery_script/test/farmbot_celery_script/compiler_test.exs b/farmbot_celery_script/test/farmbot_celery_script/compiler_test.exs index 409c981b..e1618dd9 100644 --- a/farmbot_celery_script/test/farmbot_celery_script/compiler_test.exs +++ b/farmbot_celery_script/test/farmbot_celery_script/compiler_test.exs @@ -355,6 +355,16 @@ defmodule FarmbotCeleryScript.CompilerTest do """) end + test "`update_resource`: Multiple fields of `resource` type." do + compiled = "test/fixtures/update_resource_multi.json" + |> File.read!() + |> Jason.decode!() + |> AST.decode() + |> compile() + + assert compiled == strip_nl("?") + end + defp compile(ast) do ast |> Compiler.compile_ast([]) diff --git a/farmbot_celery_script/test/farmbot_celery_script/corpus/node_test.exs b/farmbot_celery_script/test/farmbot_celery_script/corpus/node_test.exs index e34e2aec..13b8ab19 100644 --- a/farmbot_celery_script/test/farmbot_celery_script/corpus/node_test.exs +++ b/farmbot_celery_script/test/farmbot_celery_script/corpus/node_test.exs @@ -4,7 +4,7 @@ defmodule FarmbotCeleryScript.Corpus.NodeTest do test "inspect" do a = - "Sequence(version, locals) [calibrate, change_ownership, check_updates, emergency_lock, emergency_unlock, execute, execute_script, factory_reset, find_home, flash_firmware, home, install_farmware, install_first_party_farmware, _if, move_absolute, move_relative, power_off, read_pin, read_status, reboot, remove_farmware, resource_update, send_message, set_servo_angle, set_user_env, sync, take_photo, toggle_pin, update_farmware, wait, write_pin, zero]" + "Sequence(version, locals) [calibrate, change_ownership, check_updates, emergency_lock, emergency_unlock, execute, execute_script, factory_reset, find_home, flash_firmware, home, install_farmware, install_first_party_farmware, _if, move_absolute, move_relative, power_off, read_pin, read_status, reboot, remove_farmware, update_resource, send_message, set_servo_angle, set_user_env, sync, take_photo, toggle_pin, update_farmware, wait, write_pin, zero]" b = inspect(Corpus.sequence()) assert a == b diff --git a/farmbot_celery_script/test/fixtures/mark_variable_meta.json b/farmbot_celery_script/test/fixtures/mark_variable_meta.json new file mode 100644 index 00000000..8aefc306 --- /dev/null +++ b/farmbot_celery_script/test/fixtures/mark_variable_meta.json @@ -0,0 +1,48 @@ +{ + "args": { + "locals": { + "args": {}, + "body": [ + { + "args": { + "default_value": { + "args": { + "x": 1, + "y": 2, + "z": 3 + }, + "kind": "coordinate" + }, + "label": "parent" + }, + "kind": "parameter_declaration" + } + ], + "kind": "scope_declaration" + }, + "version": -999 + }, + "body": [ + { + "args": { + "resource": { + "args": { + "label": "parent" + }, + "kind": "identifier" + } + }, + "body": [ + { + "args": { + "label": "meta.my_prop", + "value": "whatever" + }, + "kind": "pair" + } + ], + "kind": "update_resource" + } + ], + "kind": "sequence" +} \ No newline at end of file diff --git a/farmbot_celery_script/test/fixtures/mark_variable_removed.json b/farmbot_celery_script/test/fixtures/mark_variable_removed.json new file mode 100644 index 00000000..7c0e19da --- /dev/null +++ b/farmbot_celery_script/test/fixtures/mark_variable_removed.json @@ -0,0 +1,48 @@ +{ + "args": { + "locals": { + "args": {}, + "body": [ + { + "args": { + "default_value": { + "args": { + "x": 1, + "y": 2, + "z": 3 + }, + "kind": "coordinate" + }, + "label": "parent" + }, + "kind": "parameter_declaration" + } + ], + "kind": "scope_declaration" + }, + "version": -999 + }, + "body": [ + { + "args": { + "resource": { + "args": { + "label": "parent" + }, + "kind": "identifier" + } + }, + "body": [ + { + "args": { + "label": "plant_stage", + "value": "removed" + }, + "kind": "pair" + } + ], + "kind": "update_resource" + } + ], + "kind": "sequence" +} \ No newline at end of file diff --git a/farmbot_celery_script/test/fixtures/set_mounted_tool_id.json b/farmbot_celery_script/test/fixtures/set_mounted_tool_id.json new file mode 100644 index 00000000..9e4c65d9 --- /dev/null +++ b/farmbot_celery_script/test/fixtures/set_mounted_tool_id.json @@ -0,0 +1,34 @@ +{ + "args": { + "locals": { + "args": {}, + "body": [], + "kind": "scope_declaration" + }, + "version": -999 + }, + "body": [ + { + "args": { + "resource": { + "args": { + "resource_id": 0, + "resource_type": "Device" + }, + "kind": "resource" + } + }, + "body": [ + { + "args": { + "label": "mounted_tool_id", + "value": 12161 + }, + "kind": "pair" + } + ], + "kind": "update_resource" + } + ], + "kind": "sequence" +} \ No newline at end of file diff --git a/farmbot_celery_script/test/fixtures/update_resource_multi.json b/farmbot_celery_script/test/fixtures/update_resource_multi.json new file mode 100644 index 00000000..78b2b45b --- /dev/null +++ b/farmbot_celery_script/test/fixtures/update_resource_multi.json @@ -0,0 +1,41 @@ +{ + "args": { + "locals": { + "args": {}, + "body": [], + "kind": "scope_declaration" + }, + "version": -999 + }, + "body": [ + { + "args": { + "resource": { + "args": { + "resource_id": 23, + "resource_type": "Plant" + }, + "kind": "resource" + } + }, + "body": [ + { + "args": { + "label": "plant_stage", + "value": "planted" + }, + "kind": "pair" + }, + { + "args": { + "label": "r", + "value": 23 + }, + "kind": "pair" + } + ], + "kind": "update_resource" + } + ], + "kind": "sequence" +} \ No newline at end of file