/** @brief Read all blocks in the memory of the NTag I2C. * * It reads the blocks in the user memory, configuration registers block, the * SRAM blocks and the session registers. * * @param type indicates if the NTag I2C is 1k or 2k version * @param i2cAddress is the address of the device to be found on the i2c bus * @param callback is the function to be called with the result of the read on each block * * @return a list with the result on each read block */ public List <I2CData> readAll(TagType type, byte i2cAddress, Action <I2CData> callback = null) { List <I2CData> data = new List <I2CData>(); var tagMem = new NTagMemory(type); if ((type == TagType.NTAG1K) || (type == TagType.NTAG2K)) { data.AddRange(readRange(i2cAddress, tagMem.userMemoryBegin, tagMem.userMemoryEnd, callback)); if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.configMemoryBegin, tagMem.configMemoryEnd, callback)); } if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.SRAMMemoryBegin, tagMem.SRAMMemoryEnd, callback)); } if (data.Last().error == I2CError.Success) { var sessionReg = new Registers(i2cCommand, null); data.AddRange(sessionReg.readAllSessionRegister(i2cAddress, type, callback)); } } else if (type == TagType.NTAG1KPlus) { data.AddRange(readRange(i2cAddress, tagMem.userMemoryBegin, tagMem.userMemoryEnd - 1, callback)); if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.memProtBegin, tagMem.memProtEnd, callback)); } if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.configMemoryBegin, tagMem.configMemoryEnd, callback)); } if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.SRAMMemoryBegin, tagMem.SRAMMemoryEnd, callback)); } if (data.Last().error == I2CError.Success) { var sessionReg = new Registers(i2cCommand, null); data.AddRange(sessionReg.readAllSessionRegister(i2cAddress, type, callback)); } } else if (type == TagType.NTAG2KPlus) { data.AddRange(readRange(i2cAddress, tagMem.userMemoryS1Begin, tagMem.userMemoryS1End - 1, callback)); if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.memProtBegin, tagMem.memProtEnd, callback)); } if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.configMemoryBegin, tagMem.configMemoryEnd, callback)); } if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.userMemoryS2Begin, tagMem.userMemoryS2End, callback)); } if (data.Last().error == I2CError.Success) { data.AddRange(readRange(i2cAddress, tagMem.SRAMMemoryBegin, tagMem.SRAMMemoryEnd, callback)); } if (data.Last().error == I2CError.Success) { var sessionReg = new Registers(i2cCommand, null); data.AddRange(sessionReg.readAllSessionRegister(i2cAddress, type, callback)); } } return(data); }
/** @brief Write all blocks in the memory of the NTag I2C. * * It writes the writeBytes on the NTag I2C memory. The writeBytes matrix * does not have the blocks on the real memory index but it have the memory data * consecutively stored. It writes on the user memory, SRAM, configuration * registers and session registers. * * * @param type indicates if the NTag I2C is 1k or 2k version * @param i2cAddress is the address of the device to be found on the i2c bus * @param writeBytes is the matrix with the bytes to write on each block for the whole memory * @param callback is the function to be called with the result of the write on each block * * @return a list with the result on each write block */ public List <I2CData> writeAll(TagType type, byte i2cAddress, byte[][] writeBytes, Action <I2CData> callback = null) { int i2cAddressLength = 1; List <I2CData> output = new List <I2CData>(); var tagMem = new NTagMemory(type); if ((type != TagType.NTAG2KPlus) & (type != TagType.NTAG1KPlus)) { int userMemInit = tagMem.userMemoryBegin + i2cAddressLength; int startIdx = 0; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, userMemInit, tagMem.userMemoryEnd, callback)); if (output.Last().error == I2CError.Success) { startIdx += tagMem.userMemoryEnd - userMemInit; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.configMemoryBegin, tagMem.configMemoryEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.configMemoryEnd - tagMem.configMemoryBegin; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.SRAMMemoryBegin, tagMem.SRAMMemoryEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.SRAMMemoryEnd - tagMem.SRAMMemoryBegin; byte[][] _wB = new byte[bytesInBlock][]; Array.Copy(writeBytes, startIdx, _wB, 0, 1); var reg = new Registers(i2cCommand, this); var result = reg.writeAllSessionRegister(i2cAddress, _wB[0], type); output.Add(result); if (callback != null) { callback(result); } } } else if (type == TagType.NTAG1KPlus) { int userMemInit = tagMem.userMemoryBegin + i2cAddressLength; int startIdx = 0; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, userMemInit, tagMem.userMemoryEnd - 1, callback)); if (output.Last().error == I2CError.Success) { startIdx += (tagMem.userMemoryEnd - 1) - userMemInit; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.memProtBegin, tagMem.memProtEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.memProtEnd - tagMem.memProtBegin; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.configMemoryBegin, tagMem.configMemoryEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.configMemoryEnd - tagMem.configMemoryBegin; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.SRAMMemoryBegin, tagMem.SRAMMemoryEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.SRAMMemoryEnd - tagMem.SRAMMemoryBegin; byte[][] _wB = new byte[bytesInBlock][]; Array.Copy(writeBytes, startIdx, _wB, 0, 1); var reg = new Registers(i2cCommand, this); var result = reg.writeAllSessionRegister(i2cAddress, _wB[0], type); output.Add(result); if (callback != null) { callback(result); } } } else if (type == TagType.NTAG2KPlus) { int userMemInit = tagMem.userMemoryS1Begin + i2cAddressLength; int startIdx = 0; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, userMemInit, tagMem.userMemoryS1End - 1, callback)); if (output.Last().error == I2CError.Success) { startIdx += (tagMem.userMemoryS1End - 1) - userMemInit; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.memProtBegin, tagMem.memProtEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.memProtEnd - tagMem.memProtBegin; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.configMemoryBegin, tagMem.configMemoryEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.configMemoryEnd - tagMem.configMemoryBegin; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.userMemoryS2Begin, tagMem.userMemoryS2End, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.userMemoryS2End - tagMem.userMemoryS2Begin; output.AddRange(writeRange(i2cAddress, writeBytes, startIdx, tagMem.SRAMMemoryBegin, tagMem.SRAMMemoryEnd, callback)); } if (output.Last().error == I2CError.Success) { startIdx += tagMem.SRAMMemoryEnd - tagMem.SRAMMemoryBegin; byte[][] _wB = new byte[bytesInBlock][]; Array.Copy(writeBytes, startIdx, _wB, 0, 1); var reg = new Registers(i2cCommand, this); var result = reg.writeAllSessionRegister(i2cAddress, _wB[0], type); output.Add(result); if (callback != null) { callback(result); } } } return(output); }