summaryrefslogtreecommitdiff
path: root/src/IvyIO.pm
blob: 8283a0297698787e722d992e46e5ea8a628e67cb (plain)
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
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


1;