#########################################################################################
# Package HiPi::Device::GPIO::Pin
# Description: Pin
# Created Wed Feb 20 04:37:38 2013
# Copyright : Copyright (c) 2013-2025 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::Device::GPIO::Pin;
#########################################################################################
use strict;
use warnings;
use parent qw( HiPi::Pin );
use Carp;
use Fcntl;
use HiPi qw( :rpi );
use HiPi::RaspberryPi;
my $pinoffset = _calculate_sysfs_pin_offset();
our $VERSION ='0.93';
__PACKAGE__->create_accessors();
sub get_pin_offset {
return $pinoffset;
}
sub _open {
my ($class, %params) = @_;
defined($params{pinid}) or croak q(pinid not defined in parameters);
my $syspin = $params{pinid} + $pinoffset;
my $pinroot = qq(/sys/class/gpio/gpio${syspin});
croak qq(pin $params{pinid} is not exported) if !-d $pinroot;
my $self = $class->SUPER::_open(%params);
return $self;
}
sub _do_getvalue {
my $self = shift;
return HiPi::Device::GPIO->pin_read( $self->pinid );
}
sub _do_setvalue {
my( $self, $newval) = @_;
return HiPi::Device::GPIO->pin_write($self->pinid, $newval );
}
sub _do_getmode {
my $self = shift;
return HiPi::Device::GPIO->get_pin_mode($self->pinid );
}
sub _do_setmode {
my ($self, $newmode) = @_;
return HiPi::Device::GPIO->set_pin_mode($self->pinid, $newmode );
}
sub _do_getinterrupt {
my $self = shift;
return HiPi::Device::GPIO->get_pin_interrupt( $self->pinid );
}
sub _do_setinterrupt {
my ($self, $newedge) = @_;
return HiPi::Device::GPIO->set_pin_interrupt( $self->pinid, $newedge );
}
sub _do_get_interrupt_filepath {
my($self) = @_;
return HiPi::Device::GPIO->get_pin_interrupt_filepath( $self->pinid );
}
sub _do_get_function_name {
my($self) = @_;
return HiPi::Device::GPIO->get_pin_function( $self->pinid );
}
sub _do_setpud {
my($self, $pudval) = @_;
return HiPi::Device::GPIO->set_pin_pud($self->pinid, $pudval);
}
sub _do_getpud {
my($self) = @_;
return HiPi::Device::GPIO->get_pin_pud($self->pinid);
}
sub _do_setschmitt {
my( $self, $val ) = @_;
return HiPi::Device::GPIO->set_pin_schmitt($self->pinid, $val);
}
sub _do_getschmitt {
my( $self ) = @_;
return HiPi::Device::GPIO->get_pin_schmitt($self->pinid);
}
sub _do_setslew {
my( $self, $val ) = @_;
return HiPi::Device::GPIO->set_pin_slew($self->pinid, $val);
}
sub _do_getslew {
my( $self ) = @_;
return HiPi::Device::GPIO->get_pin_slew($self->pinid);
}
sub _do_activelow {
my($self, $newval) = @_;
my $result = undef;
if( defined( $newval ) ) {
$result = HiPi::Device::GPIO->set_pin_activelow($self->pinid, $newval);
} else {
$result = HiPi::Device::GPIO->get_pin_activelow($self->pinid);
}
return $result;
}
sub _calculate_sysfs_pin_offset {
my $offset = 0;
{
my $result = qx(cat /sys/kernel/debug/gpio 2>&1 | grep 'ID_SDA');
if ( $result && $result =~ /gpio-([0-9]+)/ ) {
$offset = $1;
}
}
return $offset;
}
1;