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
|
package IvyIO;
use strict;
use Ivy;
my $ivy;
# init an ivy bus
sub init {
my ($appname, $bus, $conncb, $disconncb) = @_;
Ivy->init(-loopMode => 'TK',
-appName => $appname,
-ivyBus => $bus,
);
$ivy = Ivy->new(-statusFunc => sub {&_status($conncb, $disconncb, @_);});
$ivy->start;
} # end init
# kill a named agent
sub kill {
my $appname = shift;
$ivy->sendDieTo($appname);
} # end kill
sub _status {
my ($conncb, $disconncb, $ref_array_present, $ref_array_absent,
$ref_hash_present, $agent, $status, $host) = @_;
if ($status eq "new") {
&$conncb($agent, $host);
} elsif ($status eq "died") {
&$disconncb($agent, $host);
}
} # end _status
#------------------------------------------------------------------------
#
# output
#
#------------------------------------------------------------------------
sub send_rate {
my ($rate) = shift;
return unless $ivy;
$ivy->sendMsgs("SetClock Rate=$rate");
} # end ivy_send_rate
sub send_time {
my ($time) = shift;
return unless $ivy;
$ivy->sendMsgs("SetClock Time=$time");
} # end send_time
sub send_pause {
return unless $ivy;
$ivy->sendMsgs("ClockStop");
} # end send_pause
sub send_play {
return unless $ivy;
$ivy->sendMsgs("ClockStart");
} # end send_play_command
#------------------------------------------------------------------------
#
# input
#
#------------------------------------------------------------------------
sub bind_for_play_event {
my $cb = shift;
return unless $cb;
return unless $ivy;
$ivy->bindRegexp("^ClockStart", [sub { shift; &$cb(); }]);
} # end bind_for_play_event
sub bind_for_pause_event {
my $cb = shift;
return unless $cb;
return unless $ivy;
$ivy->bindRegexp("^ClockStop", [sub { shift; &$cb(); }]);
} # end bind_for_pause_event
# execute the callback with arguments <time> and <rate>
sub bind_for_clock_and_rate_event {
my $cb = shift;
return unless $cb;
return unless $ivy;
$ivy->bindRegexp('^ClockEvent Time=(\d\d):(\d\d):(\d\d) Rate=(.*) Bs=.*',
[sub { shift; &$cb(@_); }]);
$ivy->bindRegexp('^ClockDatas Time=(\d\d):(\d\d):(\d\d) Rate=(.*) Bs=.*',
[sub { shift; &$cb(@_); }]);
} # end bind_for_clock_event
# execute the callback kill all
sub bind_for_kill_all {
my $cb = shift;
return unless $cb;
return unless $ivy;
$ivy->bindRegexp('IvyControlPanel KillAll',
[sub { shift; &$cb(); }]);
} # end bind_for_clock_event
1;
|