csys: init steps via env state, use Environ.forward_value() to send messages to sensors

This commit is contained in:
Helmut Merz 2026-05-25 11:04:45 +02:00
parent 5b9597ea79
commit 45086fc424
3 changed files with 38 additions and 43 deletions

View file

@ -20,7 +20,7 @@ defmodule Scopes.CSys.Environ do
{:exec, func} -> func.(state) {:exec, func} -> func.(state)
[:csys, :created | _rest] -> [:csys, :created | _rest] ->
process_creation(msg, scope) process_creation(msg, scope)
send(env, msg) #send(env, msg)
_ -> send(env, msg) # forward message to application _ -> send(env, msg) # forward message to application
end end
end end
@ -57,7 +57,7 @@ defmodule Scopes.CSys.Environ do
CSys.send_message(cell, head, data) CSys.send_message(cell, head, data)
end end
def connect(state, addr, target, op) do def connect(state, addr, target, op \\ []) do
send_message(state, addr, ~w(csys connect)a, send_message(state, addr, ~w(csys connect)a,
%{target: get_cell(state, target), op: op}) %{target: get_cell(state, target), op: op})
end end

View file

@ -134,34 +134,34 @@ defmodule Scopes.CSys.Program do
# demo init sequences # demo init sequences
def init_seq_b1() do [ def init_seq_b1() do
fn %Environ.State{neurons: [zero]} -> zero = [:csys, :c00, {0, 0}]
CSys.send_message(zero, ~w(csys create pred)a, one = [:csys, :s01, {1, 0}]
%{op: [CSys.data_only(), negate()]}) 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, end,
fn %Environ.State{neurons: [one | _ns]} -> fn state ->
CSys.send_message(one, ~w(csys create succ)a, %{op: CSys.data_only()}) Environ.send_message(state, one, ~w(csys create succ)a,
%{op: CSys.data_only(), addr: two})
end, end,
fn %Environ.State{neurons: [two | _ns]} -> fn state ->
CSys.send_message(two, ~w(csys create pred)a) Environ.send_message(state, two, ~w(csys create pred)a, %{addr: three})
end, end,
fn %Environ.State{neurons: [three | others]} -> fn state -> Environ.connect(state, three, zero) end
zero = List.last(others)
CSys.send_message(three, ~w(csys connect)a, %{target: zero})
end
] ]
end end
def init_recursive_1() do [ def init_recursive_1() do
fn state ->
zero = [:csys, :c00, {0, 0}] zero = [:csys, :c00, {0, 0}]
#%Environ.State{neurons: [zero]} = state [
#CSys.send_message(zero, ~w(csys connect)a, %{target: zero, op: negate()}) fn state ->
#Environ.send_message(state, zero, ~w(csys connect)a, %{target: zero, op: negate()})
Environ.connect(state, zero, zero, negate()) Environ.connect(state, zero, zero, negate())
Environ.send_message(state, zero, ~w(csys create succ)a, Environ.send_message(state, zero, ~w(csys create succ)a,
%{addr: [:csys, :e01, {1, 1}]}) %{addr: [:csys, :e01, {1, 1}]})
#CSys.send_message(zero, ~w(csys create succ)a, %{addr: [:csys, :e01, {1, 1}]})
end end
] ]
end end

View file

@ -2,7 +2,7 @@ defmodule Scopes.CSysTest do
use ExUnit.Case, async: true use ExUnit.Case, async: true
@moduletag timeout: 5000 @moduletag timeout: 5000
alias Scopes.CSys #alias Scopes.CSys
alias Scopes.CSys.Environ alias Scopes.CSys.Environ
alias Scopes.CSys.Program alias Scopes.CSys.Program
alias Scopes.Shape alias Scopes.Shape
@ -18,18 +18,15 @@ defmodule Scopes.CSysTest do
describe "basic-program:" do describe "basic-program:" do
test "minimal-b1" do test "minimal-b1" do
_env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1()) env = Environ.setup(Program.prepare_basic(), Program.init_seq_b1())
zero = receive_data(~w(csys created)a).new #receive_data(~w(csys created)a)
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
Process.sleep(10) 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 == 1
#assert receive_data().value in [-1, 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]
assert receive_data().value in [2, 3] assert receive_data().value in [2, 3]
refute_received msg, "unhandled message(s): #{inspect(msg)}" refute_received msg, "unhandled message(s): #{inspect(msg)}"
@ -37,10 +34,8 @@ defmodule Scopes.CSysTest do
test "recursive-1" do test "recursive-1" do
env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1()) env = Environ.setup(Program.prepare_basic(), Program.init_recursive_1())
_zero = receive_data(~w(csys created)a).new #receive_data(~w(csys created)a)
_eff = receive_data(~w(csys created)a).new
Process.sleep(10) Process.sleep(10)
#CSys.send_value(zero, 42)
Environ.forward_value(env, [:csys, :c00, {0, 0}], 42) Environ.forward_value(env, [:csys, :c00, {0, 0}], 42)
assert receive_data().value == 42 assert receive_data().value == 42
refute_received msg, "unhandled message(s): #{inspect(msg)}" refute_received msg, "unhandled message(s): #{inspect(msg)}"