Fix:Core:Correct attribute alloc and free
[navit-package] / navit / script / gps_emu4
1 #! /usr/bin/perl
2 use Glib qw/TRUE FALSE/;
3 use Gtk2 '-init';
4
5 sub exit_with_error
6 {
7         my ($error)=@_;
8         print STDERR "$error\n";
9         exit(1);
10 }
11
12 sub process_one_packet
13 {
14         $pos[$idx++]=tell(STDIN);
15         while (<STDIN>) {
16                 if (!defined($match)) {
17                         syswrite(STDOUT,$_) or exit_with_error $!;
18                 } else {
19                         $buffer.=$_;
20                 }
21                 if (/^\$GPRMC/) {
22                         my($dummy,$time,$dummy)=split(/,/,$_);
23                         $entry->set_text($time);
24                         if (!defined($match)) {
25                                 return;
26                         }
27                         if (substr($time,0,length($match)) eq $match) {
28                                 undef $match;
29                                 syswrite(STDOUT,$buffer) or exit_with_error $!;
30                                 return;
31                         }
32                         $buffer='';
33                 }
34         }
35 }
36
37 sub process_one_packet_at_idx
38 {
39         ($idx)=@_;
40         seek(STDIN,$pos[$idx],SEEK_SET);
41         process_one_packet();
42 }
43
44 sub forward
45 {
46         process_one_packet();
47         return 1;
48 }
49
50 sub backward
51 {
52         if ($idx > 1) {
53                 process_one_packet_at_idx($idx-2);
54         }
55         return 1;
56 }
57
58 sub add_timeout
59 {
60         my ($interval,$dir)=@_;
61
62         if ($timeout > 0) {
63                 Glib::Source->remove($timeout);
64         }
65         if ($dir > 0) {
66                 forward();
67                 $timeout=Glib::Timeout->add ($interval, \&forward);
68         }
69         if ($dir < 0) {
70                 backward();
71                 $timeout=Glib::Timeout->add ($interval, \&backward);
72         }
73 }
74
75 sub entry
76 {
77         $match=$entry->get_text();
78         seek(STDIN,0,SEEK_SET);
79         process_one_packet();
80 }
81
82 $oldfh = select(STDOUT); $| = 1; select($oldfh);
83 $window = Gtk2::Window->new('toplevel');
84 $box = Gtk2::HBox->new();
85 $window->add($box);
86 $button = Gtk2::Button->new("Stop");
87 $button->signal_connect(clicked => sub { add_timeout(0,0) });
88 $box->add($button);
89 $button = Gtk2::Button->new("100 Hz");
90 $button->signal_connect(clicked => sub { add_timeout(10,-1); });
91 $box->add($button);
92 $button = Gtk2::Button->new("10 Hz");
93 $button->signal_connect(clicked => sub { add_timeout(100,-1); });
94 $box->add($button);
95 $button = Gtk2::Button->new("4 Hz");
96 $button->signal_connect(clicked => sub { add_timeout(250,-1); });
97 $box->add($button);
98 $button = Gtk2::Button->new("1 Hz");
99 $button->signal_connect(clicked => sub { add_timeout(1000,-1); });
100 $box->add($button);
101 $button = Gtk2::Button->new("-");
102 $button->signal_connect(clicked => sub { add_timeout(0,0) ; backward() });
103 $box->add($button);
104 $entry = Gtk2::Entry->new();
105 $entry->set_text("???");
106 $entry->signal_connect(activate => \&entry);
107 $box->add($entry);
108 $button = Gtk2::Button->new("+");
109 $button->signal_connect(clicked => sub { add_timeout(0,0) ; forward() });
110 $box->add($button);
111 $button = Gtk2::Button->new("1 Hz");
112 $button->signal_connect(clicked => sub { add_timeout(1000,1); });
113 $box->add($button);
114 $button = Gtk2::Button->new("4 Hz");
115 $button->signal_connect(clicked => sub { add_timeout(250,1); });
116 $box->add($button);
117 $button = Gtk2::Button->new("10 Hz");
118 $button->signal_connect(clicked => sub { add_timeout(100,1); });
119 $box->add($button);
120 $button = Gtk2::Button->new("100 Hz");
121 $button->signal_connect(clicked => sub { add_timeout(10,1); });
122 $box->add($button);
123 $button = Gtk2::Button->new("Max");
124 $button->signal_connect(clicked => sub { add_timeout(1,1); });
125 $box->add($button);
126 $window->show_all;
127 if ($ARGV[0]) {
128         $match=$ARGV[0];
129         process_one_packet();
130 }
131 Gtk2->main;
132 0;