diff --git a/apps/csys/lib/application.ex b/apps/csys/lib/application.ex index f945ffd..f1fdc6a 100644 --- a/apps/csys/lib/application.ex +++ b/apps/csys/lib/application.ex @@ -1,6 +1,8 @@ defmodule Scopes.CSys.Application do use Application + alias Scopes.Core.Environ + alias Scopes.Core.Program alias Scopes.Util require Logger @@ -10,9 +12,9 @@ defmodule Scopes.CSys.Application do @impl true def start(type, args) do IO.puts("Hello CSys") - Logger.info(Util.show [type, args]) + Logger.info(Util.show [type, args, self()]) children = [ - {Scopes.Core.Environ, init: []}, + {Environ, [Program.prepare_basic(), Program.init_recursive_1()]}, Scopes.CSys.Server.Endpoint ] opts = [strategy: :one_for_one, name: Scopes.CSys.Supervisor] diff --git a/config/test.exs b/config/test.exs index 5185143..3bbc3a4 100644 --- a/config/test.exs +++ b/config/test.exs @@ -3,7 +3,7 @@ import Config config :logger, :default_handler, - level: System.get_env("SCOPES_LOG_LEVEL", "info") |> String.to_atom, + level: System.get_env("SCOPES_LOG_LEVEL", "notice") |> String.to_atom, config: [ file: ~c"test/log/scopes_test.log" ] diff --git a/lib/core/core.ex b/lib/core/core.ex index 865138f..3b80acf 100644 --- a/lib/core/core.ex +++ b/lib/core/core.ex @@ -27,6 +27,7 @@ defmodule Scopes.Core do end def notify(msg, scope) do + Logger.info(Util.show [msg]) Actor.send(env(scope), msg) end diff --git a/lib/core/environ.ex b/lib/core/environ.ex index 988f46d..2ede5b7 100644 --- a/lib/core/environ.ex +++ b/lib/core/environ.ex @@ -5,34 +5,29 @@ defmodule Scopes.Core.Environ do alias Scopes.Core.Actor alias Scopes.Core.Shape + require Logger + defmodule State do defstruct [cells: %{}, init_seq: []] end - def child_spec(opts) do - %{id: __MODULE__, - start: {__MODULE__, :start_link, opts}} - end - - def start_link(opts \\ []) do - #IO.inspect(opts) - Registry.start_link(keys: :unique, name: @cell_registry) - zero_spec = opts[:zero_spec] - if zero_spec do - setup(zero_spec, opts[:init_seq] || []) - end - end - def cells(), do: @cell_registry + def child_spec(opts) do + %{id: __MODULE__, + start: {__MODULE__, :setup, opts}} + end + def setup({state, proc}, init_seq, proc_env \\ &proc_env/2) do + Registry.start_link(keys: :unique, name: cells()) env_scope = {%State{init_seq: init_seq}, proc_env, [], self()} env = Core.neuron(env_scope) Actor.register(env, cells(), {:env, :c00}) msg = Shape.create([:csys, :zero], data: %{addr: [:csys, :c00, "0-0"]}) scope = {state, proc, [], env} Core.create(msg, scope) - env + #{:ok, env} + :ignore end def proc_env(msg, scope = {state, _proc, _syns, env}) do @@ -59,10 +54,24 @@ defmodule Scopes.Core.Environ do state1 = %State{cells: cells, init_seq: seq} Core.update({state1, proc, syns, env}) if step do + Process.sleep(1) step.(state1) end end + # accessing cell registry + + def get_cell(addr) do + data = Registry.lookup(cells(), addr) + if data do + [{cell, _val}] = data + cell + else + Logger.warning "No cell found at address #{inspect(addr)}!" + nil + end + end + # accessing cell registry via state.cells def get_cell(state, [dom, cat, item]) do diff --git a/test/core/core_test.exs b/test/core/core_test.exs index 12db1fb..503d916 100644 --- a/test/core/core_test.exs +++ b/test/core/core_test.exs @@ -17,12 +17,9 @@ defmodule Scopes.CoreTest do describe "core-basic:" do test "minimal-b1" do - Environ.start_link( - zero_spec: Program.prepare_basic(), - init_seq: Program.init_seq_b1()) - #env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) - Process.sleep(50) - [{env, _val}] = Registry.lookup(Environ.cells(), {:env, :c00}) + Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) + Process.sleep(10) + env = Environ.get_cell({:env, :c00}) Environ.forward_value(env, [:csys, :c00, "0-0"], 0) assert 0 = receive_data().value Environ.forward_value(env, [:csys, :s01, "1-0"], 1) @@ -31,18 +28,18 @@ defmodule Scopes.CoreTest do Environ.forward_value(env, [:csys, :s01, "1-1"], 3) assert receive_data().value in [2, 3] assert receive_data().value in [2, 3] - refute_receive msg, 30, "unhandled message(s): #{inspect(msg)}" + refute_receive msg, 10, "unhandled message(s): #{inspect(msg)}" end test "recursive-1" do - Environ.start_link() - env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) - Process.sleep(50) + Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) + Process.sleep(10) + env = Environ.get_cell({:env, :c00}) Environ.forward_value(env, [:csys, :s01, "1-1"], 42) assert receive_data().value == 42 Environ.forward_value(env, [:csys, :s01, "1-1"], 47) assert receive_data().value == 5 - refute_receive msg, 30, "unhandled message(s): #{inspect(msg)}" + refute_receive msg, 10, "unhandled message(s): #{inspect(msg)}" end end end