実装方法に悩んでいるので助言をお願いしたいです。
ICカードリーダライタとの通信を行うプログラムの作成をしています。
リーダライタの機能で、カードの検出待ちを行うPollingコマンドがあるのですが、
FeliCaカード用とMIFAREカード用とでそれぞれ別のPollingコマンドが存在しており、
また同時に二つのカードの検出待ちをすることができません。
そのため2つのカードを同時に取り扱いたい場合は、
FeliCa用Pollingを送り、検出のタイムアウトが発生したらMIFARE用Pollingコマンドを送る。
検出のタイムアウトが発生したらFeliCa用Pollingコマンドを送る。
というのを繰り返すのが基本になるかと思います。
リーダライタからのタイムアウトのレスポンスは、
FeliCa用PollingとMIFARE用Pollingで共通となっていますので、
基本的にはタイムアウトを受け取ったら、前回送ったPollingコマンドじゃないものを送るだけなのですが。
作成中のソフトウェアでは、設定値によってFeliCaカードを使うか、MIFAREカードを使うか、それとも両方を使うのかを選べるようになっているため
その設定値によっても送るコマンドを選択する必要があります。
コマンドのコードを渡せば、コマンドに対応したパケットデータの作成からリーダライタへの送信までを行ってくれる関数は作成済みのため後はどっちのPollingコマンドを送るのかという処理を実装するだけになります
c++
1static const quint8 felica_polling = 0x00; 2static const quint8 felica_polling_res = 0x01; 3static const quint8 mifare_polling = 0xC0; 4static const quint8 mifare_polling_res = 0xC1; 5static const quint8 time_out = 0x7E; 6 7// リーダライタから受信データがある場合、readData関数を呼び出すように関連付け 8connect(device_serial_port_, &QSerialPort::readyRead, this, &IcCardReaderWriter::readData); 9 10void IcCardReaderWriter::readData() 11{ 12 switch(receive_command) 13 { 14 case felica_polling_res: 15 // 受信したデータを処理 16 // 【次送るべきpollingコマンドの選択】 17 break; 18 19 case mifare_polling_res: 20 // 受信したデータを処理 21 // 【次送るべきpollingコマンドの選択】 22 break; 23 24 case time_out: 25 // 【次送るべきpollingコマンドの選択】 26 break; 27 } 28} 29 30void IcCardReaderWriter::writeData(quint8 command_code) 31{ 32 // 渡されたコマンドコードを元にデータを作成してリーダライタへ送信処理 33}
この**【次送るべきpollingコマンドの選択】**という処理の部分を
1つの関数を呼ぶだけで、呼び出し側はカードの使用設定は?前回はどちらだった?というのを
意識せずに処理ができるようにしたいと思っております
カードの使用設定とのからみが厄介で、どうにかしてスマートに実装できないものかと悩んでいるところです
少し長くなってしまいましたが、助言をよろしくお願いします。
足りない情報が有りましたら適宜追記させていただきます。
回答3件
あなたの回答
tips
プレビュー