|
|
#!/usr/bin/perl
# If using interupts the HiPi::Interrupt module should be used
# before anything else in your script. This is because the
# module loads threads to handle interrupts for pins managed
# by HiPi::Device::GPIO, HiPi::BCM2835 and HiPi::Wiring.
# Loading first reduces your memory footprint and avoids issues
# with modules you may use that are not thread safe.
use HiPi::Interrupt;
# To demonstrate use with HiPi::BCM2835 access
# to pins we must run the script using 'sudo'.
# If we only used HiPi::Device::GPIO pins then
# sudo usage is not necessary provided the user
# running the process is a member of the gpio
# group.
use HiPi::BCM2835;
# Some basic modules loaded
use 5.14.0;
use strict;
use warnings;
use HiPi::Device::GPIO;
use HiPi::Constant qw( :raspberry );
# instead of deriving a class we use HiPi::Interrupt::Handler
# directly and register callbacks for one or more of:
#
# start, add, remove, interrupt,
# error, continue, stop
use HiPi::Interrupt::Handler;
my $handler = HiPi::Interrupt::Handler->new;
# register a callback for interrupts
$handler->register_callback('interrupt', sub {
my ($self, $msg ) = @_;
say'--------------------------------';
my $output = ( $msg->error ) ? 'ERROR MESSAGE' : uc($msg->action) . ' HANDLED';
say $output;
say qq( action : ) . $msg->action;
say qq( pinid : ) . $msg->pinid;
say qq( error : ) . $msg->error;
say qq( value : ) . $msg->value;
say qq( timestamp : ) . $msg->timestamp;
say qq( msgtext : ) . $msg->msgtext;
say qq( pinclass : ) . $msg->pinclass;
say'--------------------------------';
});
# register a callback for start
$handler->register_callback('start', sub {
my ($self) = @_;
say 'INTERRUPT HANDLING STARTED';
});
# register a callback for stop
$handler->register_callback('stop', sub {
my ($self) = @_;
say 'INTERRUPT HANDLING STOPPED';
});
# Create the pin monitoring
{
# setup a pin as input with a pull up
# resistor and falling edge interrupt
# using HiPi::Device::GPIO
my $dev = HiPi::Device::GPIO->new;
my $pin1 = $dev->export_pin( RPI_PAD1_PIN_13 );
$pin1->mode(RPI_PINMODE_INPT);
$pin1->set_pud(RPI_PUD_OFF);
$pin1->set_pud(RPI_PUD_UP);
$pin1->interrupt( RPI_INT_FALL );
# setup a pin as input with a pull down
# resistor and rising edge interrupt
# using HiPi::BCM2835 ( requires running
# using sudo for /dev/mem access so
# by default this example uses gpio
# device driver)
my $bcm = HiPi::BCM2835->new;
my $pin2 = $bcm->get_pin( RPI_PAD1_PIN_11 );
$pin2->mode(RPI_PINMODE_INPT);
$pin2->set_pud(RPI_PUD_OFF);
$pin2->set_pud(RPI_PUD_DOWN);
$pin2->interrupt( RPI_INT_RISE );
# add pins demonstrating using the alternate
# method specifying a pin number and class
$handler->add_pin( RPI_PAD1_PIN_13, 'gpio' );
$handler->add_pin( RPI_PAD1_PIN_11, 'bcmd' );
}
# run the application loop
$handler->poll();
1;