summaryrefslogtreecommitdiff
path: root/navit/script/gps_emu4
blob: 342a3b4abd2eb288049f42f9e627010ec285bc13 (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
115
116
117
118
119
120
121
122
#! /usr/bin/perl
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';

sub exit_with_error
{
	my ($error)=@_;
	print STDERR "$error\n";
	exit(1);
}

sub process_one_packet
{
	$pos[$idx++]=tell(STDIN);
	while (<STDIN>) {
		if (!defined($match)) {
			syswrite(STDOUT,$_) or exit_with_error $!;
		} else {
			$buffer.=$_;
		}
		if (/^\$GPRMC/) {
			my($dummy,$time,$dummy)=split(/,/,$_);
			$entry->set_text($time);
			if (!defined($match)) {
				return;
			}
			if (substr($time,0,length($match)) eq $match) {
				undef $match;
				syswrite(STDOUT,$buffer) or exit_with_error $!;
				return;
			}
			$buffer='';
		}
	}
}

sub process_one_packet_at_idx
{
	($idx)=@_;
	seek(STDIN,$pos[$idx],SEEK_SET);
	process_one_packet();
}

sub forward
{
	process_one_packet();
	return 1;
}

sub backward
{
	if ($idx > 1) {
		process_one_packet_at_idx($idx-2);
	}
	return 1;
}

sub add_timeout
{
	my ($interval,$dir)=@_;

	if ($timeout > 0) {
		Glib::Source->remove($timeout);
	}
	if ($dir > 0) {
		forward();
		$timeout=Glib::Timeout->add ($interval, \&forward);
	}
	if ($dir < 0) {
		backward();
		$timeout=Glib::Timeout->add ($interval, \&backward);
	}
}

sub entry
{
	$match=$entry->get_text();
	seek(STDIN,0,SEEK_SET);
	process_one_packet();
}

$oldfh = select(STDOUT); $| = 1; select($oldfh);
$window = Gtk2::Window->new('toplevel');
$box = Gtk2::HBox->new();
$window->add($box);
$button = Gtk2::Button->new("Stop");
$button->signal_connect(clicked => sub { add_timeout(0,0) });
$box->add($button);
$button = Gtk2::Button->new("100 Hz");
$button->signal_connect(clicked => sub { add_timeout(10,-1); });
$box->add($button);
$button = Gtk2::Button->new("10 Hz");
$button->signal_connect(clicked => sub { add_timeout(100,-1); });
$box->add($button);
$button = Gtk2::Button->new("1 Hz");
$button->signal_connect(clicked => sub { add_timeout(1000,-1); });
$box->add($button);
$button = Gtk2::Button->new("-");
$button->signal_connect(clicked => sub { add_timeout(0,0) ; backward() });
$box->add($button);
$entry = Gtk2::Entry->new();
$entry->set_text("???");
$entry->signal_connect(activate => \&entry);
$box->add($entry);
$button = Gtk2::Button->new("+");
$button->signal_connect(clicked => sub { add_timeout(0,0) ; forward() });
$box->add($button);
$button = Gtk2::Button->new("1 Hz");
$button->signal_connect(clicked => sub { add_timeout(1000,1); });
$box->add($button);
$button = Gtk2::Button->new("10 Hz");
$button->signal_connect(clicked => sub { add_timeout(100,1); });
$box->add($button);
$button = Gtk2::Button->new("100 Hz");
$button->signal_connect(clicked => sub { add_timeout(10,1); });
$box->add($button);
$button = Gtk2::Button->new("Max");
$button->signal_connect(clicked => sub { add_timeout(1,1); });
$box->add($button);
$window->show_all;
Gtk2->main;
0;