private void OnDetected(IFeliCaReader reader)
        {
            Idm.Value    = string.Empty;
            Access.Value = null;
            Logs.Clear();

            var idm = reader.ExecutePolling(0x0003);

            if (idm.Length == 0)
            {
                return;
            }

            var block = new ReadBlock {
                BlockNo = 0
            };

            if (!reader.ExecuteReadWoe(idm, 0x008B, block))
            {
                return;
            }

            var blocks1 = Enumerable.Range(0, 8).Select(x => new ReadBlock {
                BlockNo = (byte)x
            }).ToArray();
            var blocks2 = Enumerable.Range(8, 8).Select(x => new ReadBlock {
                BlockNo = (byte)x
            }).ToArray();
            var blocks3 = Enumerable.Range(16, 4).Select(x => new ReadBlock {
                BlockNo = (byte)x
            }).ToArray();

            if (!reader.ExecuteReadWoe(idm, 0x090F, blocks1) ||
                !reader.ExecuteReadWoe(idm, 0x090F, blocks2) ||
                !reader.ExecuteReadWoe(idm, 0x090F, blocks3))
            {
                return;
            }

            Idm.Value    = HexEncoder.ToHex(idm);
            Access.Value = Suica.ConvertToAccessData(block.BlockData);
            Logs.AddRange(blocks1.Concat(blocks2).Concat(blocks3)
                          .Select(x => Suica.ConvertToLogData(x.BlockData))
                          .Where(x => x != null)
                          .ToArray());
        }