Example #1
0
        /** @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);
        }
Example #2
0
        /** @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);
        }