1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
#! /usr/bin/env ruby
# -*- coding: UTF-8 -*-
require 'iotas'
HBN_PATH='hibernate.json'
#
class InputDoor < Iotas::Door
#
@count = 0
#
class << self
attr_accessor :count
end
#
def initialize n, p
super n, p
@lines = [ "#{name} says : hello", "world ( from #{path} )" ]
@idx = 0
end
#
def start!
puts " -> start #{self.class.name} (#{@path})"
# stimulate myself
p = require_p Iotas::Particle
p.add_dst Iotas::ACT_GET, path
send_p p
end
#
def stop!
puts " >- stop #{self.class.name} (#{@path})"
end
#
def hibernate!
puts " !! hibernate #{self.class.name} (#{@path})"
# we want to remember where we are in the data flow
{'idx'=>@idx}
end
#
def resume! o
puts " !! resume #{self.class.name} (#{@path})"
# restore idx
@idx = o['idx']
end
#
def receive_p p
puts " @ #{self.class.name} (#{@path}) receive_p : #{p.action}"
if p.action==Iotas::ACT_GET
p.reset!
p.set_data 'line', @lines[@idx]
p.set_data 'f0', 'v0'
p.set_data 'f1', 'v1'
p.set_data 'f2', 'v2'
send_p p # will follow the link
@idx+=1
if @idx<@lines.length
# there is more to read, restimulate myself
p = require_p Iotas::Particle
p.add_dst Iotas::ACT_GET, name
send_p p
end
else
# we can release it or let the Door do it
release_p p
end
# I want to hibernate now!
self.class.count+=1
if self.class.count==3
p = require_p Iotas::Particle
p[Iotas::FIELD_HIBERNATE_PATH] = HBN_PATH
p.add_dst Iotas::SYS_ACT_HIBERNATE
send_sys_p p
end
end
#
end
#
class ConcatBoard < Iotas::Board
#
def initialize n, p, m=false
super n, p
@manual = m
end
#
def start!
puts " -> start #{self.class.name} (#{@path})"
end
#
def stop!
puts " >- stop #{self.class.name} (#{@path})"
end
#
def receive_p p
puts " @ #{self.class.name} receive_p : #{p.action}"
if p.action==Iotas::ACT_ERROR
#
else
if @manual
# cleanup unnecessary p2 Particle
p2 = p.merged_shift
p.set_data 'line', (p.data('line')+' '+p2.data('line'))
release_p p2
else
# Or let the system do it
p.set_data 'line', (p.data('line')+' '+p.merged(0).data('line'))
end
send_p p
end
end
#
end
#
class OutputDoor < Iotas::Door
#
def initialize n, p, c=false
super n, p
@clean = c
end
#
def start!
puts " -> start #{self.class.name} (#{@path})"
end
#
def stop!
puts " >- stop #{self.class.name} (#{@path})"
end
#
def receive_p p
puts " #==> #{self.class.name} (#{@path}) receive_p : #{p.get_data('line')}"
if @clean
release_p p
else
# we do nothing Iotas::Door#process_p will detect it and release it
end
end
#
end
#
spin = Iotas::Spin.new 'dom0', :debug_routing=>false, :debug_errors=>true
#
room0 = Iotas::Room.new 'room0', spin
room1 = Iotas::Room.new 'room1', spin
#
input0 = InputDoor.new 'input0', room0
output0 = OutputDoor.new 'output0', room0
#
input1 = InputDoor.new 'input1', room1
output1 = OutputDoor.new 'output1', room1, true
concat1 = ConcatBoard.new 'concat1', room1
#
room0.add_link Iotas::Link.new('input0', 'output0', nil, nil, nil)
#
p0 = spin.require_p Iotas::Particle
p0.set_data Iotas::LNK_SRC, 'input1'
p0.set_data Iotas::LNK_DSTS, 'concat1?follow,output1'
p0.set_data Iotas::LNK_FIELDS, 'f0,f2'
p0.set_data Iotas::LNK_CONDF, 'f0,f1,f2'
p0.set_data Iotas::LNK_CONDV, 'v0v1v2'
p0.add_dst Iotas::SYS_ACT_ADD_LINK, room1.path
room1.send_sys_p p0 # send_sys_p -> room0 -> spin -> room1 -> input1
#
spin.spin!
#
dom0 = Iotas::Spin.resume! HBN_PATH
dom0.spin!
File.unlink HBN_PATH if File.exists? HBN_PATH
#
# EOF
|