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
|
#########################################################################################
# Package HiPi::Energenie::ENER314
# Description : Control Energenie ENER314 board
# Copyright : Copyright (c) 2016-2017 Mark Dootson
# License : This is free software; you can redistribute it and/or modify it under
# the same terms as the Perl 5 programming language system itself.
#########################################################################################
package HiPi::Energenie::ENER314;
#########################################################################################
use strict;
use warnings;
use parent qw( HiPi::Class );
use Carp;
use HiPi qw( :rpi :energenie );
use HiPi::GPIO;
use Time::HiRes;
__PACKAGE__->create_accessors( qw( device signal_d0_pin signal_d1_pin signal_d2_pin signal_d3_pin
mode_select_pin mode_enable_pin ) );
our $VERSION ='0.81';
sub new {
my( $class, %userparams ) = @_;
my %params = (
signal_d0_pin => RPI_PIN_11,
signal_d1_pin => RPI_PIN_15,
signal_d2_pin => RPI_PIN_16,
signal_d3_pin => RPI_PIN_13,
mode_select_pin => RPI_PIN_18,
mode_enable_pin => RPI_PIN_22,
);
foreach my $key (sort keys(%userparams)) {
$params{$key} = $userparams{$key};
}
unless( defined($params{device}) ) {
$params{device} = HiPi::GPIO->new;
}
my $self = $class->SUPER::new(%params);
# setup defaults
$self->_init();
return $self;
}
sub _init {
my $self = shift;
$self->device->set_pin_mode( $self->mode_enable_pin, RPI_MODE_OUTPUT );
$self->device->set_pin_level( $self->mode_enable_pin, RPI_LOW );
$self->device->set_pin_mode( $self->mode_select_pin, RPI_MODE_OUTPUT );
$self->device->set_pin_level( $self->mode_select_pin, RPI_LOW );
$self->device->set_pin_mode( $self->signal_d0_pin, RPI_MODE_OUTPUT );
$self->device->set_pin_level( $self->signal_d0_pin, RPI_LOW );
$self->device->set_pin_mode( $self->signal_d1_pin, RPI_MODE_OUTPUT );
$self->device->set_pin_level( $self->signal_d1_pin, RPI_LOW );
$self->device->set_pin_mode( $self->signal_d2_pin, RPI_MODE_OUTPUT );
$self->device->set_pin_level( $self->signal_d2_pin, RPI_LOW );
$self->device->set_pin_mode( $self->signal_d3_pin, RPI_MODE_OUTPUT );
$self->device->set_pin_level( $self->signal_d3_pin, RPI_LOW );
}
sub send_gpio_message {
my($self, $data ) = @_;
$self->device->set_pin_level( $self->mode_enable_pin, RPI_LOW );
$self->device->set_pin_level( $self->signal_d0_pin, ( $data & 8 ) ? 1 : 0 );
$self->device->set_pin_level( $self->signal_d1_pin, ( $data & 4 ) ? 1 : 0 );
$self->device->set_pin_level( $self->signal_d2_pin, ( $data & 2 ) ? 1 : 0 );
$self->device->set_pin_level( $self->signal_d3_pin, ( $data & 1 ) ? 1 : 0 );
Time::HiRes::sleep( 0.1 );
$self->device->set_pin_level( $self->mode_enable_pin, RPI_HIGH );
Time::HiRes::sleep( 1.0 );
$self->device->set_pin_level( $self->mode_enable_pin, RPI_LOW );
return;
}
#-------------------------------------------------------
# Common OOK switch handler
#-------------------------------------------------------
sub switch_ook_socket {
my($self, $groupid, $data, $repeat) = @_;
# $groupid is ignored as this board has a single hard coded id
$self->send_gpio_message( $data );
}
sub DESTROY {
my $self = shift;
$self->SUPER::DESTROY;
$self->device( undef );
}
1;
__END__
|