From 45086fc424d5fd733c8f2a5ed9249d1cdf874979 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 25 May 2026 11:04:45 +0200 Subject: [PATCH] csys: init steps via env state, use Environ.forward_value() to send messages to sensors --- lib/csys/environ.ex | 4 ++-- lib/csys/program.ex | 56 ++++++++++++++++++++++----------------------- test/csys_test.exs | 21 +++++++---------- 3 files changed, 38 insertions(+), 43 deletions(-) diff --git a/lib/csys/environ.ex b/lib/csys/environ.ex index 5e9954d..77b8931 100644 --- a/lib/csys/environ.ex +++ b/lib/csys/environ.ex @@ -20,7 +20,7 @@ defmodule Scopes.CSys.Environ do {:exec, func} -> func.(state) [:csys, :created | _rest] -> process_creation(msg, scope) - send(env, msg) + #send(env, msg) _ -> send(env, msg) # forward message to application end end @@ -57,7 +57,7 @@ defmodule Scopes.CSys.Environ do CSys.send_message(cell, head, data) end - def connect(state, addr, target, op) do + def connect(state, addr, target, op \\ []) do send_message(state, addr, ~w(csys connect)a, %{target: get_cell(state, target), op: op}) end diff --git a/lib/csys/program.ex b/lib/csys/program.ex index ea83c4b..f5bd956 100644 --- a/lib/csys/program.ex +++ b/lib/csys/program.ex @@ -134,35 +134,35 @@ defmodule Scopes.CSys.Program do # demo init sequences - def init_seq_b1() do [ - fn %Environ.State{neurons: [zero]} -> - CSys.send_message(zero, ~w(csys create pred)a, - %{op: [CSys.data_only(), negate()]}) - end, - fn %Environ.State{neurons: [one | _ns]} -> - CSys.send_message(one, ~w(csys create succ)a, %{op: CSys.data_only()}) - end, - fn %Environ.State{neurons: [two | _ns]} -> - CSys.send_message(two, ~w(csys create pred)a) - end, - fn %Environ.State{neurons: [three | others]} -> - zero = List.last(others) - CSys.send_message(three, ~w(csys connect)a, %{target: zero}) - end - ] + def init_seq_b1() do + zero = [:csys, :c00, {0, 0}] + one = [:csys, :s01, {1, 0}] + two = [:csys, :c00, {1, 1}] + three = [:csys, :s01, {1, 1}] + [ + fn state -> + Environ.send_message(state, zero, ~w(csys create pred)a, + %{op: [CSys.data_only(), negate()], addr: one}) + end, + fn state -> + Environ.send_message(state, one, ~w(csys create succ)a, + %{op: CSys.data_only(), addr: two}) + end, + fn state -> + Environ.send_message(state, two, ~w(csys create pred)a, %{addr: three}) + end, + fn state -> Environ.connect(state, three, zero) end + ] end - def init_recursive_1() do [ - fn state -> - zero = [:csys, :c00, {0, 0}] - #%Environ.State{neurons: [zero]} = state - #CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: negate()}) - #Environ.send_message(state, zero, ~w(csys connect)a, %{target: zero, op: negate()}) - Environ.connect(state, zero, zero, negate()) - Environ.send_message(state, zero, ~w(csys create succ)a, - %{addr: [:csys, :e01, {1, 1}]}) - #CSys.send_message(zero, ~w(csys create succ)a, %{addr: [:csys, :e01, {1, 1}]}) - end - ] + def init_recursive_1() do + zero = [:csys, :c00, {0, 0}] + [ + fn state -> + Environ.connect(state, zero, zero, negate()) + Environ.send_message(state, zero, ~w(csys create succ)a, + %{addr: [:csys, :e01, {1, 1}]}) + end + ] end end diff --git a/test/csys_test.exs b/test/csys_test.exs index 8f9ad60..84ae696 100644 --- a/test/csys_test.exs +++ b/test/csys_test.exs @@ -2,7 +2,7 @@ defmodule Scopes.CSysTest do use ExUnit.Case, async: true @moduletag timeout: 5000 - alias Scopes.CSys + #alias Scopes.CSys alias Scopes.CSys.Environ alias Scopes.CSys.Program alias Scopes.Shape @@ -18,18 +18,15 @@ defmodule Scopes.CSysTest do describe "basic-program:" do test "minimal-b1" do - _env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) - zero = receive_data(~w(csys created)a).new - CSys.send_value(zero, 0) - assert 0 = receive_data().value - one = receive_data(~w(csys created)a).new - _two = receive_data(~w(csys created)a).new - three = receive_data(~w(csys created)a).new + env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) + #receive_data(~w(csys created)a) Process.sleep(10) - CSys.send_value(one, 1) + Environ.forward_value(env, [:csys, :c00, {0, 0}], 0) + assert 0 = receive_data().value + Environ.forward_value(env, [:csys, :s01, {1, 0}], 1) assert receive_data().value == 1 #assert receive_data().value in [-1, 1] - CSys.send_value(three, 3) + Environ.forward_value(env, [:csys, :s01, {1, 1}], 3) assert receive_data().value in [2, 3] assert receive_data().value in [2, 3] refute_received msg, "unhandled message(s): #{inspect(msg)}" @@ -37,10 +34,8 @@ defmodule Scopes.CSysTest do test "recursive-1" do env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) - _zero = receive_data(~w(csys created)a).new - _eff = receive_data(~w(csys created)a).new + #receive_data(~w(csys created)a) Process.sleep(10) - #CSys.send_value(zero, 42) Environ.forward_value(env, [:csys, :c00, {0, 0}], 42) assert receive_data().value == 42 refute_received msg, "unhandled message(s): #{inspect(msg)}"