void interruptHandler();
int setInterrupt(int pin, int edge, char *callback);
char *perl_callback;
PerlInterpreter *mine;
void interruptHandler(){
PERL_SET_CONTEXT(mine);
dSP;
PUSHMARK(SP);
PUTBACK;
call_pv(perl_callback, G_DISCARD|G_NOARGS);
FREETMPS;
LEAVE;
}
int setInterrupt(int pin, int edge, char *callback){
perl_callback = callback;
int interrupt = wiringPiISR(pin, edge, &interruptHandler);
return interrupt;
}
# XS
int
setInterrupt(pin, edge, callback)
int pin
int edge
char *callback
void
interruptHandler()
####
sub set_interrupt {
shift if @_ == 4;
my ($pin, $edge, $callback) = @_;
setInterrupt($pin, $edge, $callback);
}
####
use warnings;
use strict;
use RPi::WiringPi;
use RPi::WiringPi::Constant qw(:all);
my $pi = RPi::WiringPi->new();
my $pin = $pi->pin(27);
RPi::WiringPi::Core::set_interrupt(
$pin->num,
EDGE_RISING,
'pin_27_edge_rise'
);
$pin->mode(INPUT);
sleep 10;
# manually change the pin state here to trigger
# interrupt
$pi->cleanup;
sub pin_27_edge_rise {
print "pin 27 edge rise callback...\n";
# do other stuff
}