## Mixed Handlers Example

    #!/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;

HiPi Modules Copyright © 2013 - 2016 Mark Dootson