… | |
… | |
153 | |
153 | |
154 | sub retry { |
154 | sub retry { |
155 | my ($self) = @_; |
155 | my ($self) = @_; |
156 | |
156 | |
157 | delete $self->{fh}; |
157 | delete $self->{fh}; |
|
|
158 | delete $self->{command}; |
158 | |
159 | |
159 | Scalar::Util::weaken $self; |
160 | Scalar::Util::weaken $self; |
160 | $self->{retry_w} = AnyEvent->timer (after => 1, cb => sub { |
161 | $self->{retry_w} = AnyEvent->timer (after => 1, cb => sub { |
161 | delete $self->{retry_w}; |
162 | delete $self->{retry_w}; |
162 | $self->connect; |
163 | $self->connect; |
… | |
… | |
206 | $self->retry; |
207 | $self->retry; |
207 | }, |
208 | }, |
208 | on_eof => sub { |
209 | on_eof => sub { |
209 | $! = &Errno::EPIPE; |
210 | $! = &Errno::EPIPE; |
210 | $self->event ("error"); |
211 | $self->event ("error"); |
|
|
212 | $self->log ("disconnect"); |
211 | $self->retry; |
213 | $self->retry; |
212 | }, |
214 | }, |
213 | on_read => sub { |
215 | on_read => sub { |
214 | $_[0]{rbuf} =~ s/^([^\015\012]*)\015\012// |
216 | $_[0]{rbuf} =~ s/^([^\015\012]*)\015\012// |
215 | or return; |
217 | or return; |
… | |
… | |
222 | $self->send ("o"); |
224 | $self->send ("o"); |
223 | $self->send ("y"); |
225 | $self->send ("y"); |
224 | $self->send ("c"); |
226 | $self->send ("c"); |
225 | |
227 | |
226 | $self->event ("connect"); |
228 | $self->event ("connect"); |
|
|
229 | $self->log ("connect"); |
227 | } else { |
230 | } else { |
228 | $self->event ("error"); |
231 | $self->event ("error"); |
229 | } |
232 | } |
230 | }; |
233 | }; |
231 | |
234 | |
… | |
… | |
251 | sub feed { |
254 | sub feed { |
252 | my ($self, $line) = @_; |
255 | my ($self, $line) = @_; |
253 | |
256 | |
254 | $self->{now} = AnyEvent->now; |
257 | $self->{now} = AnyEvent->now; |
255 | |
258 | |
|
|
259 | $self->log (raw => $line) |
|
|
260 | if $self->{logfh}; |
|
|
261 | |
256 | unless ($line =~ /^GPSD,(.)=(.*)$/) { |
262 | unless ($line =~ /^GPSD,(.)=(.*)$/) { |
257 | $! = &Errno::EBADMSG; |
263 | $! = &Errno::EBADMSG; |
258 | $self->event ("error"); |
264 | $self->event ("error"); |
259 | return $self->retry; |
265 | return $self->retry; |
260 | } |
266 | } |
261 | |
267 | |
262 | my ($type, $data) = ($1, $2); |
268 | my ($type, $data) = ($1, $2); |
|
|
269 | |
|
|
270 | #warn "$type=$data\n";#d# |
263 | |
271 | |
264 | $self->{state}{$type} = [$data => $self->{now}]; |
272 | $self->{state}{$type} = [$data => $self->{now}]; |
265 | |
273 | |
266 | if ($type eq "O") { |
274 | if ($type eq "O") { |
267 | my @data = split /\s+/, $data; |
275 | my @data = split /\s+/, $data; |
… | |
… | |
348 | # if we likely have zero speed, return the point itself |
356 | # if we likely have zero speed, return the point itself |
349 | ($fix->{lat}, $fix->{lon}) |
357 | ($fix->{lat}, $fix->{lon}) |
350 | } |
358 | } |
351 | } |
359 | } |
352 | |
360 | |
|
|
361 | sub log { |
|
|
362 | my ($self, @arg) = @_; |
|
|
363 | |
|
|
364 | syswrite $self->{logfh}, JSON::encode_json ([AnyEvent->time, @arg]) . "\n" |
|
|
365 | if $self->{logfh}; |
|
|
366 | } |
|
|
367 | |
|
|
368 | sub record_log { |
|
|
369 | my ($self, $path) = @_, |
|
|
370 | |
|
|
371 | require JSON; |
|
|
372 | |
|
|
373 | open $self->{logfh}, ">", $path |
|
|
374 | or Carp::croak "$path: $!"; |
|
|
375 | |
|
|
376 | $self->log (start => $VERSION); |
|
|
377 | } |
|
|
378 | |
353 | =back |
379 | =back |
354 | |
380 | |
355 | =head1 SEE ALSO |
381 | =head1 SEE ALSO |
356 | |
382 | |
357 | L<AnyEvent>. |
383 | L<AnyEvent>. |