Sub Process_Globals
'These global variables will be declared once when the application starts.
'Public variables can be accessed from all modules.
Public Serial1 As Serial
Public nfc As PN532
Public high As ULong
Public keya(6)=Array As Byte(0xff,0xff,0xff,0xff,0xff,0xff) As Byte
Public uid(7)=Array As Byte(0,0,0,0,0,0,0) As Byte
Public uid_len(1) As Byte
Public bc As ByteConverter
End Sub
Private Sub AppStart
Serial1.Initialize(115200)
Log("AppStart")
nfc.Initialize1(10)
Public low=nfc.FirmwareVersion As ULong
high=low
RunNative("shift_right", Null) '32bit shift, return top 16 bits
Log("chip: ",Bit.HighByte(high))
Log("version: ",Bit.LowByte(high))
Log("revision: ",Bit.HighByte(low))
Log("support: ",Bit.LowByte(low))
nfc.PassiveActivationRetries(0xff)
If nfc.SAMConfig Then
Log("config passed")
AddLooper("read_card_data")
' write_read
Else
Log("reader config problem")
End If
End Sub
Sub write_read
'detect a card over the reader, blocks code, timeout 1 secs
If nfc.readPassiveTargetID(0,uid,uid_len,10000) Then
Log("uid length is: ",uid_len(0))
nfc.PrintHex(uid,uid_len(0))
Public data(16)=Array As Byte(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) As Byte
Public blck=5 As Int
'must authenticate a sector with key before reading
Log("auth: ",nfc.mifareclassic_AuthenticateBlock(uid,uid_len(0),blck,0,keya))
'now we can read the block
Log("read: ",nfc.mifareclassic_ReadDataBlock(blck,data))
nfc.PrintHexChar(data,16)
'create byte array to write to card
data=Array As Byte(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
Public str()=bc.StringToBytes("your data here") As Byte
bc.ArrayCopy2(str,0,data,0,str.Length)
nfc.PrintHexChar(data,data.Length)
'write array to card
Log("write: ",nfc.mifareclassic_WriteDataBlock(blck,data))
'read block that was just written
Log("read: ",nfc.mifareclassic_ReadDataBlock(blck,data))
nfc.PrintHexChar(data,16)
Else
Log("no card timeout")
End If
End Sub
Sub read_card_data
Public success As Boolean
If nfc.readPassiveTargetID(0,uid,uid_len,1000) Then
Log("uid length is: ",uid_len(0))
nfc.PrintHex(uid,uid_len(0))
Public data(16)=Array As Byte(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0) As Byte
For i = 0 To 63
If nfc.mifareclassic_IsFirstBlock(i) Then
success=nfc.mifareclassic_AuthenticateBlock(uid,uid_len(0),i,0,keya)
Log("block auth: ",i)
End If
If success Then
If nfc.mifareclassic_ReadDataBlock(i,data) Then
nfc.PrintHexChar(data,16)
Else
Log("failed to read block")
End If
Else
Log("block auth failure")
Return
End If
Next
Else
Log("no card")
End If
End Sub
#if C
void shift_right(B4R::Object* unused)
{
b4r_main::_high = b4r_main::_high >> 16;
}
#End If