AnyEvent-CurrentCost

 view release on metacpan or  search on metacpan

lib/AnyEvent/CurrentCost.pm  view on Meta::CPAN

use strict;
use warnings;
package AnyEvent::CurrentCost;
{
  $AnyEvent::CurrentCost::VERSION = '1.130190';
}

# ABSTRACT: AnyEvent module for reading from Current Cost energy meters


use constant DEBUG => $ENV{ANYEVENT_CURRENT_COST_DEBUG};
use base qw/Device::CurrentCost/;
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::SerialPort;
use Carp qw/croak carp/;
use Sub::Name;


sub new {
  my ($pkg, %p) = @_;
  croak $pkg.q{->new: 'callback' parameter is required} unless ($p{callback});
  my $self = $pkg->SUPER::new(%p);
  $self;
}

sub DESTROY { shift->cleanup }


sub cleanup {
  my $self = shift;
  print STDERR "cleanup\n" if DEBUG;
  delete $self->{handle};
  close $self->filehandle if (defined $self->filehandle);
}

sub _error {
  my ($self, $fatal, $message) = @_;
  $self->cleanup($message);
  $self->{on_error}->($fatal, $message) if ($self->{on_error});
}


sub open {
  my $self = shift;
  my $fh = $self->filehandle;
  my $handle =
    $fh
      ? AnyEvent::Handle->new(fh => $fh)
        : AnyEvent::SerialPort->new(serial_port =>
                                    [ $self->device,
                                      [ baudrate => $self->baud ] ]);
  print STDERR ref $self, "->open: created ", $handle, "\n" if DEBUG;
  $self->{handle} = $handle;
  $handle->on_error(subname 'on_error' => sub {
                      my ($handle, $fatal, $msg) = @_;
                      print STDERR $handle.": error $msg\n" if DEBUG;
                      $handle->destroy;
                      $self->_error($fatal, 'Error: '.$msg);
                    });
  $handle->on_rtimeout(subname 'on_rtimeout' => sub {
                         my $rbuf = \$handle->{rbuf};
                         carp $handle, ": Discarding '", $$rbuf, "'\n";
                         $$rbuf = '';
                         $handle->rtimeout(undef);
                       });
  $handle->on_read(subname 'on_read_cb' => sub {
                     my ($hdl) = @_;
                     $hdl->push_read(ref $self => $self,
                                     subname 'push_read_cb' => sub {
                                       $self->{callback}->(@_);
                                       1;
                                     });
                   });
}

sub _time_now {
  AnyEvent->now;
}


sub anyevent_read_type {
  my ($handle, $cb, $self) = @_;



( run in 0.480 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )