package yuuhayashi.pasori.felica;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import yuuhayashi.pasori.felica.Felica.FelicaException;



/**
 * このプログラムのソースは、
 * [亜細亜大学であがたが行う授業に関するサイトです。]から流用したものです。
 * 	http://itasan.mydns.jp/wiki.cgi/ASIA?page=Java%A4%CE%B1%FE%CD%D1%A1%A7Felica%A5%AB%A1%BC%A5%C9%A5%EA%A1%BC%A5%C0#p0
 * 
 * プログラムの実行には、
 * 		[Java Native Access (jna.jar)] < https://jna.dev.java.net/ >
 * と、
 * 		[felicalib (felicalib.dll)] < http://felicalib.tmurakam.org/ >
 *  が、別途必要になります。
 * 
 * 
 * @author hayashi
 *
 */
@SuppressWarnings("serial")
public class FelicaIdReader extends JFrame {
    private Felica felica;
    
    private JPanel idPanel = new JPanel();
    private JTextField idField = new JTextField(16);
    
    private JPanel pmPanel = new JPanel();
    private JTextField pmField = new JTextField(16);
    
    boolean active = true;

	public FelicaIdReader() {
        super("'FeliCa' IDmリーダ");
        try {
            felica = new Felica();
        }
        catch (FelicaException e) {
            System.err.println("フェリカカードリーダにアクセスできません");
            System.exit(-1);
        }
        
        // 終了時処理の追加
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                active = false;
                synchronized (felica) {
                    felica.close();
                }
                System.exit(0);
            }
        });
        
        this.setLayout(new GridLayout(3, 1));
        
        idPanel.setLayout(new FlowLayout());
        idPanel.add(new JLabel("IDm "));
        idPanel.add(idField);
        this.add(idPanel);
        
        pmPanel.setLayout(new FlowLayout());
        pmPanel.add(new JLabel("PMm "));
        pmPanel.add(pmField);
        this.add(pmPanel);
        
        this.add(new JLabel("Copyright (c) 2009 by Hayashi,Yuu."));
        this.pack();

        // IDが全部表示されないこともあるため、幅を変更する
        Dimension dim = getPreferredSize();
        if (dim.getWidth() < 300) {
        	this.setPreferredSize(new Dimension(300, (int)dim.getHeight()));
            this.pack();
        }

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = this.getSize();
        this.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
        this.setVisible(true);
        
        // Felicaカードの読み取りループ
        String Id = null;
        String Pm = null;
        String before = null;
        while (active) {
            try {
                Id = felica.getID(Felica.WILDCARD);
                Pm = felica.getPM(Felica.WILDCARD);
            }
            catch (FelicaException e) {
                Id = null;
            }
            
            if (Id != null) {
            	if (!Id.equals(before)) {
            		before = new String(Id);
                	idField.setText(Id);
                	pmField.setText(Pm);
            	}
            }
            else {
            	before = null;
            	idField.setText("");
            	pmField.setText("");
            }
            
            try {
                Thread.sleep(500); // 0.5秒おきに読み取り
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

	public static void main(String[] args) {
		new FelicaIdReader();
	}

}

