diff --git a/MFRC522.cpp b/MFRC522.cpp index 87a242b..d050812 100644 --- a/MFRC522.cpp +++ b/MFRC522.cpp @@ -958,6 +958,62 @@ byte MFRC522::MIFARE_Transfer( byte blockAddr ///< The block (0-0xff) number. return STATUS_OK; } // End MIFARE_Transfer() +/** + * Helper routine to read the current value from a Value Block. + * + * Only for MIFARE Classic and only for blocks in "value block" mode, that + * is: with access bits [C1 C2 C3] = [110] or [001]. The sector containing + * the block must be authenticated before calling this function. + * + * @param[in] blockAddr The block (0x00-0xff) number. + * @param[out] value Current value of the Value Block. + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_GetValue(byte blockAddr, long *value) { + byte status; + byte buffer[18]; + byte size = sizeof(buffer); + + // Read the block + status = MIFARE_Read(blockAddr, buffer, &size); + if (status == STATUS_OK) { + // Extract the value + *value = (long(buffer[3])<<24) | (long(buffer[2])<<16) | (long(buffer[1])<<8) | long(buffer[0]); + } + return status; +} // End MIFARE_GetValue() + +/** + * Helper routine to write a specific value into a Value Block. + * + * Only for MIFARE Classic and only for blocks in "value block" mode, that + * is: with access bits [C1 C2 C3] = [110] or [001]. The sector containing + * the block must be authenticated before calling this function. + * + * @param[in] blockAddr The block (0x00-0xff) number. + * @param[in] value New value of the Value Block. + * @return STATUS_OK on success, STATUS_??? otherwise. + */ +byte MFRC522::MIFARE_SetValue(byte blockAddr, long value) { + byte buffer[18]; + + // Translate the long into 4 bytes; repeated 2x in value block + buffer[0] = buffer[ 8] = (value & 0xFF); + buffer[1] = buffer[ 9] = (value & 0xFF00) >> 8; + buffer[2] = buffer[10] = (value & 0xFF0000) >> 16; + buffer[3] = buffer[11] = (value & 0xFF000000) >> 24; + // Inverse 4 bytes also found in value block + buffer[4] = ~buffer[0]; + buffer[5] = ~buffer[1]; + buffer[6] = ~buffer[2]; + buffer[7] = ~buffer[3]; + // Address 2x with inverse address 2x + buffer[12] = buffer[14] = blockAddr; + buffer[13] = buffer[15] = ~blockAddr; + + // Write the whole data block + return MIFARE_Write(blockAddr, buffer, 16); +} // End MIFARE_SetValue() ///////////////////////////////////////////////////////////////////////////////////// // Support functions diff --git a/MFRC522.h b/MFRC522.h index ec14ca5..ed67d78 100644 --- a/MFRC522.h +++ b/MFRC522.h @@ -314,7 +314,9 @@ public: byte MIFARE_Restore(byte blockAddr); byte MIFARE_Transfer(byte blockAddr); byte MIFARE_Ultralight_Write(byte page, byte *buffer, byte bufferSize); - + byte MIFARE_GetValue(byte blockAddr, long *value); + byte MIFARE_SetValue(byte blockAddr, long value); + ///////////////////////////////////////////////////////////////////////////////////// // Support functions ///////////////////////////////////////////////////////////////////////////////////// diff --git a/examples/MifareClassicValueBlock/MifareClassicValueBlock.ino b/examples/MifareClassicValueBlock/MifareClassicValueBlock.ino index 1558e51..e0ec757 100644 --- a/examples/MifareClassicValueBlock/MifareClassicValueBlock.ino +++ b/examples/MifareClassicValueBlock/MifareClassicValueBlock.ino @@ -1,4 +1,4 @@ -/* +/** * ---------------------------------------------------------------------------- * This is a MFRC522 library example; see https://github.com/miguelbalboa/rfid * for further details and other examples. @@ -37,7 +37,7 @@ MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. MFRC522::MIFARE_Key key; -/* +/** * Initialize. */ void setup() { @@ -59,7 +59,7 @@ void setup() { Serial.println("BEWARE: Data will be written to the PICC, in sector #1"); } -/* +/** * Main loop. */ void loop() { @@ -207,7 +207,7 @@ void loop() { return; } // Show the new value of valueBlockA - status = mifare_GetValue(valueBlockA, &value); + status = mfrc522.MIFARE_GetValue(valueBlockA, &value); if (status != MFRC522::STATUS_OK) { Serial.print("mifare_GetValue() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); @@ -231,7 +231,7 @@ void loop() { return; } // Show the new value of valueBlockB - status = mifare_GetValue(valueBlockB, &value); + status = mfrc522.MIFARE_GetValue(valueBlockB, &value); if (status != MFRC522::STATUS_OK) { Serial.print("mifare_GetValue() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); @@ -242,7 +242,7 @@ void loop() { // Check some boundary... if (value <= -100) { Serial.println("Below -100, so resetting it to 255 = 0xFF just for fun..."); - status = mifare_SetValue(valueBlockB, 255); + status = mfrc522.MIFARE_SetValue(valueBlockB, 255); if (status != MFRC522::STATUS_OK) { Serial.print("mifare_SetValue() failed: "); Serial.println(mfrc522.GetStatusCodeName(status)); @@ -260,7 +260,7 @@ void loop() { mfrc522.PCD_StopCrypto1(); } -/* +/** * Helper routine to dump a byte array as hex values to Serial. */ void dump_byte_array(byte *buffer, byte bufferSize) { @@ -270,46 +270,7 @@ void dump_byte_array(byte *buffer, byte bufferSize) { } } -/* - * Helper routine to read the current value from a Value Block. - */ -byte mifare_GetValue(byte blockAddr, long *value) { - byte status; - byte buffer[18]; - byte size = sizeof(buffer); - - status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); - if (status == MFRC522::STATUS_OK) { - *value = (long(buffer[3])<<24) | (long(buffer[2])<<16) | (long(buffer[1])<<8) | long(buffer[0]); - } - return status; -} - -/* - * Helper routine to write a value into a Value Block. - */ -byte mifare_SetValue(byte blockAddr, long value) { - byte buffer[18]; - - // Translate the long into 4 bytes; repeated 2x in value block - buffer[0] = buffer[ 8] = (value & 0xFF); - buffer[1] = buffer[ 9] = (value & 0xFF00) >> 8; - buffer[2] = buffer[10] = (value & 0xFF0000) >> 16; - buffer[3] = buffer[11] = (value & 0xFF000000) >> 24; - // Inverse 4 bytes also found in value block - buffer[4] = ~buffer[0]; - buffer[5] = ~buffer[1]; - buffer[6] = ~buffer[2]; - buffer[7] = ~buffer[3]; - // Address 2x with inverse address 2x - buffer[12] = buffer[14] = blockAddr; - buffer[13] = buffer[15] = ~blockAddr; - - // Write the whole data block - return mfrc522.MIFARE_Write(blockAddr, buffer, 16); -} - -/* +/** * Ensure that a given block is formatted as a Value Block. */ void formatValueBlock(byte blockAddr) { diff --git a/keywords.txt b/keywords.txt index 891afb4..5690ce9 100644 --- a/keywords.txt +++ b/keywords.txt @@ -47,6 +47,8 @@ MIFARE_Read KEYWORD2 MIFARE_Write KEYWORD2 MIFARE_Increment KEYWORD2 MIFARE_Ultralight_Write KEYWORD2 +MIFARE_GetValue KEYWORD2 +MIFARE_SetValue KEYWORD2 PCD_MIFARE_Transceive KEYWORD2 PICC_GetType KEYWORD2 PICC_DumpToSerial KEYWORD2