HiPi
view release on metacpan or search on metacpan
lib/HiPi/Constant.pm view on Meta::CPAN
MFRC522_NOCMDCH => 0x07, # No command change.
MFRC522_RECEIVE => 0x08, # Receive Data
MFRC522_TRANSCEIVE => 0x0C, # Transmit and receive data,
MFRC522_AUTHENT => 0x0E, # Authentication Key
MFRC522_SOFTRESET => 0x0F, # Reset
# Mifare_One tag command word
MIFARE_REQIDL => 0x26, # find the antenna area does not enter hibernation
MIFARE_REQALL => 0x52, # find all the tags antenna area
MIFARE_ANTICOLL => 0x88, # anti-collision
MIFARE_CASCADE => 0x88, # cascade tag
MIFARE_SELECTTAG => 0x93, # selection tag
MIFARE_SELECT_CL1 => 0x93,
MIFARE_SELECT_CL2 => 0x95,
MIFARE_SELECT_CL3 => 0x97,
MIFARE_AUTHENT1A => 0x60, # authentication key A
MIFARE_AUTHENT1B => 0x61, # authentication key B
MIFARE_READ => 0x30, # Read Block
MIFARE_WRITE => 0xA0, # write block
MIFARE_DECREMENT => 0xC0, # debit
MIFARE_INCREMENT => 0xC1, # recharge
lib/HiPi/Interface/MAX7219.pm view on Meta::CPAN
}
my $self = $class->SUPER::new(%params);
$self->set_display_test( 0 );
return $self;
}
sub write_code_char {
my($self, $matrix, $char, $flags, $cascade) = @_;
$flags //= 0x00;
$char //= ' ';
my $byte = _get_code_char( $char );
if( $flags & MAX7219_FLAG_DECIMAL ) {
$byte |= 0x80;
}
$self->send_segment_matrix( $matrix, $byte, $cascade );
$self->sleep_milliseconds(10);
}
sub send_segment_matrix {
# send data for single matrix
my($self, $matrix, $byte, $cascade) = @_;
return unless($matrix >= 0 && $matrix < 8 );
my $reg = MAX7219_REG_DIGIT_0 + $matrix;
$self->send_command( $reg, $byte, $cascade );
}
sub send_command {
my($self, $register, $data, $cascade ) = @_;
$cascade ||= 0;
my @bytes = ( $register, $data );
if( $cascade ) {
for (my $i = 0; $i < $cascade; $i ++ ) {
push( @bytes, MAX7219_REG_NOOP, 0x00 );
}
}
$self->device->transfer_byte_array( @bytes );
return;
}
sub send_raw_bytes {
my($self, @bytes) = @_;
$self->device->transfer_byte_array( @bytes );
return;
}
sub set_decode_mode {
my($self, $mode, $cascade ) = @_;
# only covers all on or all off
# see data sheet for mixed settings
$mode = ( $mode ) ? 0xFF : 0x00;
$self->send_command( MAX7219_REG_DECODE_MODE, $mode, $cascade );
return;
}
sub set_intensity {
my($self, $value, $cascade ) = @_;
# value between 0 ( min ) and 15 ( max )
$value &= 0xF;
$self->send_command( MAX7219_REG_INTENSITY, $value, $cascade );
return;
}
sub set_scan_limit {
my($self, $value, $cascade ) = @_;
# value between 0 and 7 - how many registers are scanned
$value &= 0x7;
$self->send_command( MAX7219_REG_SCAN_LIMIT, $value, $cascade );
return;
}
sub shutdown {
my($self, $cascade ) = @_;
$self->send_command( MAX7219_REG_SHUTDOWN, 0x00, $cascade );
return;
}
sub wake_up {
my($self, $cascade ) = @_;
$self->send_command( MAX7219_REG_SHUTDOWN, 0x01, $cascade );
return;
}
sub set_display_test {
my( $self, $testmode, $cascade ) = @_;
$testmode = ( $testmode ) ? 0x01 : 0x00;
$self->send_command( MAX7219_REG_TEST, $testmode, $cascade );
$self->sleep_milliseconds(10);
}
1;
__END__
lib/HiPi/Interface/MFRC522.pm view on Meta::CPAN
size => 0,
data => [],
sak => 0,
};
$validbits ||= 0;
# bool uidComplete;
# bool selectDone;
# bool useCascadeTag;
# byte cascadeLevel = 1;
# MFRC522::StatusCode result;
# byte count;
# byte checkBit;
# byte index;
# byte uidIndex; // The first index in uid->uidByte[] that is used in the current Cascade Level.
# int8_t currentLevelKnownBits; // The number of known UID bits in the current Cascade Level.
# byte buffer[9]; // The SELECT/ANTICOLLISION commands uses a 7 byte standard frame + 2 bytes CRC_A
# byte bufferUsed; // The number of bytes used in the buffer, ie the number of bytes to transfer to the FIFO.
# byte rxAlign; // Used in BitFramingReg. Defines the bit position for the first bit received.
# byte txLastBits; // Used in BitFramingReg. The number of valid bits in the last transmitted byte.
lib/HiPi/Interface/MFRC522.pm view on Meta::CPAN
# // Byte 1: NVB Number of Valid Bits (in complete command, not just the UID): High nibble: complete bytes, Low nibble: Extra bits.
# // Byte 2: UID-data or CT See explanation below. CT means Cascade Tag.
# // Byte 3: UID-data
# // Byte 4: UID-data
# // Byte 5: UID-data
# // Byte 6: BCC Block Check Character - XOR of bytes 2-5
# // Byte 7: CRC_A
# // Byte 8: CRC_A
# // The BCC and CRC_A are only transmitted if we know all the UID bits of the current Cascade Level.
# //
# // Description of bytes 2-5: (Section 6.5.4 of the ISO/IEC 14443-3 draft: UID contents and cascade levels)
# // UID size Cascade level Byte2 Byte3 Byte4 Byte5
# // ======== ============= ===== ===== ===== =====
# // 4 bytes 1 uid0 uid1 uid2 uid3
# // 7 bytes 1 CT uid0 uid1 uid2
# // 2 uid3 uid4 uid5 uid6
# // 10 bytes 1 CT uid0 uid1 uid2
# // 2 CT uid3 uid4 uid5
# // 3 uid6 uid7 uid8 uid9
# // Sanity checks
if ($validbits > 80) {
return ( MFRC522_STATUS_INVALID );
}
# // Prepare MFRC522
$self->clear_bit_mask(MFRC522_REG_CollReg, 0x80); #// ValuesAfterColl=1 => Bits received after collision are cleared.
#// Repeat Cascade Level loop until we have a complete UID.
my $uidComplete = 0;
my $cascadeLevel = 1;
my( $uidIndex, $useCascadeTag, $currentLevelKnownBits, $index, $selectDone, $txLastBits, $bufferUsed, $rxAlign );
my ($respstatus, $respdata, $respvalidbits);
my ( $crcstatus, $cbuffer1, $cbuffer2 );
my ( $responseIndex, $responseLength );
my @buffer = ();
while (!$uidComplete) {
#// Set the Cascade Level in the SEL byte, find out if we need to use the Cascade Tag in byte 2.
$selectDone = 0;
if( $cascadeLevel == 1 ) {
$buffer[0] = MIFARE_SELECT_CL1;
$uidIndex = 0,
$useCascadeTag = ( $validbits && $uid->{'size'} > 4 ) ? 1 : 0;
} elsif( $cascadeLevel == 2 ) {
$buffer[0] = MIFARE_SELECT_CL2;
$uidIndex = 3,
$useCascadeTag = ( $validbits && $uid->{'size'} > 7 ) ? 1 : 0;
} elsif( $cascadeLevel == 3 ) {
$buffer[0] = MIFARE_SELECT_CL3;
$uidIndex = 6,
$useCascadeTag = 0
} else {
# should not get here
# warn qq( cascade level $cascadeLevel);
return ( MFRC522_STATUS_INTERNAL_ERROR );
}
# // How many UID bits are known in this Cascade Level?
$currentLevelKnownBits = $validbits - (8 * $uidIndex);
if ($currentLevelKnownBits < 0) {
$currentLevelKnownBits = 0;
}
lib/HiPi/Interface/MFRC522.pm view on Meta::CPAN
( $crcstatus, $cbuffer1, $cbuffer2 ) = $self->pcd_calculate_crc( \@crcdata );
if ($crcstatus != MFRC522_STATUS_OK) {
return ( $crcstatus, undef, undef );
}
if (($cbuffer1 != $respdata->[-2]) || ($cbuffer2 != $respdata->[-1])) {
return ( MFRC522_STATUS_CRC_WRONG, undef, undef );
}
if ($respdata->[0] & 0x04) { #// Cascade bit set - UID not complete yes
$cascadeLevel++;
} else {
$uidComplete = 1;
$uid->{'sak'} = $respdata->[0];
}
}
#// Set correct uid->size
$uid->{'size'} = 3 * $cascadeLevel + 1;
return ( MFRC522_STATUS_OK, $uid, $respvalidbits );
}
sub get_status_code_name {
my($self, $code) = @_;
$code //= 0xEE;
if($code == MFRC522_STATUS_OK ) {
return 'Success.';
} elsif($code == MFRC522_STATUS_ERROR ) {
lib/HiPi/Interface/MFRC522.pm view on Meta::CPAN
my $waitIRq = 0x10;
my @sendData = ( $command, $blockAddr );
for (my $i = 0; $i < 6; $i++) { # // 6 key bytes
$sendData[2 + $i] = $key->[$i];
}
#// Use the last uid bytes as specified in http://cache.nxp.com/documents/application_note/AN10927.pdf
#// section 3.2.5 "MIFARE Classic Authentication".
#// The only missed case is the MF1Sxxxx shortcut activation,
#// but it requires cascade tag (CT) byte, that is not part of uid.
for (my $i = 0; $i < 4; $i++) { #// The last 4 bytes of the UID
$sendData[8 + $i] = $uid->{'data'}->[$i + $uid->{'size'} -4];
}
my ($piccstatus, $piccdata, $piccvalidbits) = $self->pcd_communicate_with_picc( MFRC522_AUTHENT, $waitIRq, \@sendData );
return $piccstatus;
}
sub picc_dump_classic_sector {
( run in 0.634 second using v1.01-cache-2.11-cpan-49f99fa48dc )