![]() ![]() ![]() ![]() |
|
#!/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;