SONY製のNFCカードリーダ RC-S620/S をイニシエータとして使用し、NFC Type-A/Bと通信するライブラリです。FeliCaとは通信できません。(This library can't communicate with FeliCa! Only for NFC Type-A/B.)
RCS620S_AB.cpp@1:98c4a45b646a, 2020-06-06 (annotated)
- Committer:
- hmizuno
- Date:
- Sat Jun 06 04:58:49 2020 +0000
- Revision:
- 1:98c4a45b646a
- Parent:
- 0:16a4197a4dfb
- Child:
- 2:08ccf5062b69
bug fix
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hmizuno | 0:16a4197a4dfb | 1 | #include "mbed.h" |
hmizuno | 0:16a4197a4dfb | 2 | #include "RCS620S_AB.h" |
hmizuno | 0:16a4197a4dfb | 3 | |
hmizuno | 0:16a4197a4dfb | 4 | //public function |
hmizuno | 0:16a4197a4dfb | 5 | |
hmizuno | 0:16a4197a4dfb | 6 | //rc-s620 デフォルトボーレート;115200 |
hmizuno | 0:16a4197a4dfb | 7 | RCS620S_AB::RCS620S_AB(PinName tx, PinName rx): |
hmizuno | 0:16a4197a4dfb | 8 | _serial(tx, rx, 115200){ |
hmizuno | 0:16a4197a4dfb | 9 | initialize(); |
hmizuno | 0:16a4197a4dfb | 10 | }; |
hmizuno | 0:16a4197a4dfb | 11 | |
hmizuno | 0:16a4197a4dfb | 12 | /***************/ |
hmizuno | 0:16a4197a4dfb | 13 | /**** 制御系 ****/ |
hmizuno | 0:16a4197a4dfb | 14 | /***************/ |
hmizuno | 0:16a4197a4dfb | 15 | |
hmizuno | 0:16a4197a4dfb | 16 | void RCS620S_AB::powerDown(){ |
hmizuno | 0:16a4197a4dfb | 17 | sendCommand_and_RecieveRes(wired_data_RFConfiguration_PowerDown,(uint16_t)sizeof(wired_data_RFConfiguration_PowerDown)); |
hmizuno | 0:16a4197a4dfb | 18 | } |
hmizuno | 0:16a4197a4dfb | 19 | |
hmizuno | 0:16a4197a4dfb | 20 | void RCS620S_AB::wakeUp(){ |
hmizuno | 0:16a4197a4dfb | 21 | _serial.putc(0x55); |
hmizuno | 0:16a4197a4dfb | 22 | wait_ms(50); |
hmizuno | 0:16a4197a4dfb | 23 | } |
hmizuno | 0:16a4197a4dfb | 24 | |
hmizuno | 0:16a4197a4dfb | 25 | void RCS620S_AB::reset(){ |
hmizuno | 0:16a4197a4dfb | 26 | //”カードを”リセットするためにRFをOFF |
hmizuno | 0:16a4197a4dfb | 27 | sendCommand_and_RecieveRes(wired_data_RFConfiguration_RFoff,(uint16_t)sizeof(wired_data_RFConfiguration_RFoff)); |
hmizuno | 0:16a4197a4dfb | 28 | wait_ms(50); |
hmizuno | 0:16a4197a4dfb | 29 | sendCommand_and_RecieveRes(wired_data_Reset,(uint16_t)sizeof(wired_data_Reset)); |
hmizuno | 0:16a4197a4dfb | 30 | } |
hmizuno | 0:16a4197a4dfb | 31 | |
hmizuno | 0:16a4197a4dfb | 32 | /***************/ |
hmizuno | 0:16a4197a4dfb | 33 | /**** 受信系 ****/ |
hmizuno | 0:16a4197a4dfb | 34 | /***************/ |
hmizuno | 0:16a4197a4dfb | 35 | /*受信バッファ配列 要素番号カンペ (ATQB受信例) |
hmizuno | 0:16a4197a4dfb | 36 | |
hmizuno | 0:16a4197a4dfb | 37 | [11]D5 [12]4B [13]Tg [14~][CardRes] DCS |
hmizuno | 0:16a4197a4dfb | 38 | |
hmizuno | 0:16a4197a4dfb | 39 | [ 0] 00 [ 1] 00 [ 2] FF [ 3] 00 [ 4] FF [ 5] 00 ~ACK |
hmizuno | 0:16a4197a4dfb | 40 | [ 6] 00 [ 7] 00 [ 8] FF [ 9] 12 [10] EE ~LCS |
hmizuno | 0:16a4197a4dfb | 41 | [11] D5 [12] 4B [13] 01 [14] 01 [15] 50 ・・・ [LEN-2] DCS [LEN-1] 00 |
hmizuno | 0:16a4197a4dfb | 42 | ・全部ほしい場合:[0] ~ [LEN-1] |
hmizuno | 0:16a4197a4dfb | 43 | ・レスポンス部が欲しい場合:[11] ~ [LEN-3] |
hmizuno | 0:16a4197a4dfb | 44 | ・カードのデータ部が欲しい場合:[14] ~ [LEN-3] |
hmizuno | 0:16a4197a4dfb | 45 | */ |
hmizuno | 0:16a4197a4dfb | 46 | |
hmizuno | 0:16a4197a4dfb | 47 | //重要!配列要素集は0始まりのためLENと1ずれる! |
hmizuno | 0:16a4197a4dfb | 48 | |
hmizuno | 0:16a4197a4dfb | 49 | //※デバッグ用 受信バッファーのデータを全て取得(ACKやチェックサム含むすべてのデータ) |
hmizuno | 0:16a4197a4dfb | 50 | void RCS620S_AB::getAllRes(uint8_t ansArray[], int *ansLen){ |
hmizuno | 0:16a4197a4dfb | 51 | extractRes(0, recieveLEN-1 , ansArray, ansLen); |
hmizuno | 0:16a4197a4dfb | 52 | } |
hmizuno | 0:16a4197a4dfb | 53 | |
hmizuno | 0:16a4197a4dfb | 54 | //ACKやチェックサムを除いたレスポンスを取得 |
hmizuno | 0:16a4197a4dfb | 55 | void RCS620S_AB::getRes(uint8_t ansArray[], int *ansLen){ |
hmizuno | 0:16a4197a4dfb | 56 | uint8_t dataLen = checkRxData_and_getLEN(); |
hmizuno | 0:16a4197a4dfb | 57 | if(dataLen > 0){ |
hmizuno | 0:16a4197a4dfb | 58 | extractRes(11, 11+dataLen-3 , ansArray, ansLen); |
hmizuno | 0:16a4197a4dfb | 59 | }else{ |
hmizuno | 0:16a4197a4dfb | 60 | ansArray[0] = 0x00; |
hmizuno | 0:16a4197a4dfb | 61 | *ansLen = 0; |
hmizuno | 0:16a4197a4dfb | 62 | } |
hmizuno | 0:16a4197a4dfb | 63 | } |
hmizuno | 0:16a4197a4dfb | 64 | |
hmizuno | 0:16a4197a4dfb | 65 | //inListPasseveTarget 及び inDataExchangeからカード情報だけを取得 |
hmizuno | 0:16a4197a4dfb | 66 | void RCS620S_AB::getCardRes(uint8_t ansArray[], int *ansLen){ |
hmizuno | 0:16a4197a4dfb | 67 | |
hmizuno | 0:16a4197a4dfb | 68 | //inListPassiveTargetの場合 [11]D5 [12]4B [13]Tg [14~][CardRes] DCS |
hmizuno | 0:16a4197a4dfb | 69 | //inDataExchangeの場合 [11]D5 [12]41 [13]Status [14~][CardRes] DCS |
hmizuno | 0:16a4197a4dfb | 70 | //⇒共用可能 |
hmizuno | 0:16a4197a4dfb | 71 | |
hmizuno | 0:16a4197a4dfb | 72 | if(checkCardRes()){ |
hmizuno | 0:16a4197a4dfb | 73 | extractRes(14, recieveLEN-3 , ansArray, ansLen); |
hmizuno | 0:16a4197a4dfb | 74 | }else{ |
hmizuno | 0:16a4197a4dfb | 75 | ansArray[0] = 0x00; |
hmizuno | 0:16a4197a4dfb | 76 | *ansLen = 0; |
hmizuno | 0:16a4197a4dfb | 77 | } |
hmizuno | 0:16a4197a4dfb | 78 | } |
hmizuno | 0:16a4197a4dfb | 79 | |
hmizuno | 0:16a4197a4dfb | 80 | /***************/ |
hmizuno | 0:16a4197a4dfb | 81 | /**** 送信系 ****/ |
hmizuno | 0:16a4197a4dfb | 82 | /***************/ |
hmizuno | 0:16a4197a4dfb | 83 | |
hmizuno | 0:16a4197a4dfb | 84 | //ICカードのコマンドのデータパケット部を受け取り、チェックサムなどの付加情報を付与し送信 |
hmizuno | 0:16a4197a4dfb | 85 | void RCS620S_AB::sendCommand_and_RecieveRes(const uint8_t wired_packet_data[], uint16_t wired_packet_data_len){ |
hmizuno | 0:16a4197a4dfb | 86 | |
hmizuno | 0:16a4197a4dfb | 87 | //長すぎたらエラー |
hmizuno | 0:16a4197a4dfb | 88 | if(wired_packet_data_len > 252){ |
hmizuno | 0:16a4197a4dfb | 89 | exit(1); |
hmizuno | 0:16a4197a4dfb | 90 | } |
hmizuno | 0:16a4197a4dfb | 91 | |
hmizuno | 0:16a4197a4dfb | 92 | //0xD4で始まらなかったらエラー |
hmizuno | 0:16a4197a4dfb | 93 | if(wired_packet_data[0] != 0xD4){ |
hmizuno | 0:16a4197a4dfb | 94 | exit(1); |
hmizuno | 0:16a4197a4dfb | 95 | } |
hmizuno | 0:16a4197a4dfb | 96 | |
hmizuno | 0:16a4197a4dfb | 97 | //送信コマンド = 0x00 0x00 0xff LEN LCS [DATA PACKET] DCS 0x00 |
hmizuno | 0:16a4197a4dfb | 98 | |
hmizuno | 0:16a4197a4dfb | 99 | uint8_t *packet_data_command; |
hmizuno | 0:16a4197a4dfb | 100 | uint8_t LEN, LCS, DCS = 0x00; |
hmizuno | 0:16a4197a4dfb | 101 | uint32_t data_sum = 0x00000000; |
hmizuno | 0:16a4197a4dfb | 102 | |
hmizuno | 0:16a4197a4dfb | 103 | int i = 0; |
hmizuno | 0:16a4197a4dfb | 104 | |
hmizuno | 0:16a4197a4dfb | 105 | //LEN・LCSを計算 |
hmizuno | 0:16a4197a4dfb | 106 | LEN = (uint8_t)(wired_packet_data_len); //送信データの長さ |
hmizuno | 0:16a4197a4dfb | 107 | LCS = (uint8_t)(0x0100 - LEN); |
hmizuno | 0:16a4197a4dfb | 108 | |
hmizuno | 0:16a4197a4dfb | 109 | //card_command+リーダライタコマンド分のメモリを確保 |
hmizuno | 0:16a4197a4dfb | 110 | |
hmizuno | 0:16a4197a4dfb | 111 | packet_data_command = (uint8_t*)malloc(sizeof(uint8_t) * (LEN + 7)); |
hmizuno | 0:16a4197a4dfb | 112 | |
hmizuno | 0:16a4197a4dfb | 113 | |
hmizuno | 0:16a4197a4dfb | 114 | //カードリーダのコマンドを送信データに結合 |
hmizuno | 0:16a4197a4dfb | 115 | |
hmizuno | 0:16a4197a4dfb | 116 | packet_data_command[0] = 0x00; //Preamble |
hmizuno | 0:16a4197a4dfb | 117 | packet_data_command[1] = 0x00; //Start Of Packet_1 |
hmizuno | 0:16a4197a4dfb | 118 | packet_data_command[2] = 0xff; //Start Of Packet_2 |
hmizuno | 0:16a4197a4dfb | 119 | |
hmizuno | 0:16a4197a4dfb | 120 | packet_data_command[3] = LEN; //LEN |
hmizuno | 0:16a4197a4dfb | 121 | packet_data_command[4] = LCS; //LCS |
hmizuno | 0:16a4197a4dfb | 122 | |
hmizuno | 0:16a4197a4dfb | 123 | //パケットデータを流し込む |
hmizuno | 0:16a4197a4dfb | 124 | for(i = 0; i < LEN; i++){ |
hmizuno | 0:16a4197a4dfb | 125 | packet_data_command[i + 5] = wired_packet_data[i]; //DATA |
hmizuno | 0:16a4197a4dfb | 126 | data_sum = data_sum + wired_packet_data[i]; //DCS計算用 |
hmizuno | 0:16a4197a4dfb | 127 | } |
hmizuno | 0:16a4197a4dfb | 128 | |
hmizuno | 0:16a4197a4dfb | 129 | //DCSを計算 |
hmizuno | 0:16a4197a4dfb | 130 | DCS = (uint8_t)(0x100 - (data_sum % 0x100)); |
hmizuno | 0:16a4197a4dfb | 131 | |
hmizuno | 0:16a4197a4dfb | 132 | packet_data_command[5 + LEN] = DCS; //DCS |
hmizuno | 0:16a4197a4dfb | 133 | packet_data_command[5 + LEN + 1] = 0x00; //Postamble |
hmizuno | 0:16a4197a4dfb | 134 | |
hmizuno | 0:16a4197a4dfb | 135 | //レスポンスバッファをクリア |
hmizuno | 0:16a4197a4dfb | 136 | clearRecieveBuffer(); |
hmizuno | 0:16a4197a4dfb | 137 | |
hmizuno | 0:16a4197a4dfb | 138 | //コマンドを送信 |
hmizuno | 0:16a4197a4dfb | 139 | for(i = 0; i <= (5 + LEN + 1); i++){ |
hmizuno | 0:16a4197a4dfb | 140 | _serial.putc(packet_data_command[i]); |
hmizuno | 0:16a4197a4dfb | 141 | } |
hmizuno | 0:16a4197a4dfb | 142 | |
hmizuno | 0:16a4197a4dfb | 143 | //powerdownの時はレスポンスが返ってこないので受信待機が無限ループに入ってしまう |
hmizuno | 0:16a4197a4dfb | 144 | //powerdown時はACKのみチェックする |
hmizuno | 0:16a4197a4dfb | 145 | //コマンドリファレンス39ページ『ただしACKは返します』 |
hmizuno | 0:16a4197a4dfb | 146 | if(wired_packet_data[1] != wired_data_RFConfiguration_PowerDown[1]){ |
hmizuno | 0:16a4197a4dfb | 147 | //レスポンス受信完了まで待機 |
hmizuno | 0:16a4197a4dfb | 148 | waitWhileRead(5); |
hmizuno | 0:16a4197a4dfb | 149 | }else{ |
hmizuno | 0:16a4197a4dfb | 150 | do{ |
hmizuno | 0:16a4197a4dfb | 151 | wait_ms(1); |
hmizuno | 1:98c4a45b646a | 152 | }while(recieveLEN < sizeof(wired_complete_ACK)); |
hmizuno | 0:16a4197a4dfb | 153 | } |
hmizuno | 0:16a4197a4dfb | 154 | |
hmizuno | 0:16a4197a4dfb | 155 | //メモリをfree |
hmizuno | 0:16a4197a4dfb | 156 | free(packet_data_command); |
hmizuno | 0:16a4197a4dfb | 157 | } |
hmizuno | 0:16a4197a4dfb | 158 | |
hmizuno | 0:16a4197a4dfb | 159 | |
hmizuno | 0:16a4197a4dfb | 160 | //ICカードのコマンドを、リーダライタのInDataExchangeを使ってICカードへ送信する関数 |
hmizuno | 0:16a4197a4dfb | 161 | void RCS620S_AB::sendInDataExchange_and_RecieveRes(const uint8_t card_command[], uint16_t card_command_len){ |
hmizuno | 0:16a4197a4dfb | 162 | |
hmizuno | 0:16a4197a4dfb | 163 | //card_command+リーダライタコマンド分のメモリを確保 |
hmizuno | 0:16a4197a4dfb | 164 | uint8_t *packet_command; |
hmizuno | 0:16a4197a4dfb | 165 | packet_command = (uint8_t*)malloc(sizeof(uint8_t) * (card_command_len + 3)); |
hmizuno | 0:16a4197a4dfb | 166 | |
hmizuno | 0:16a4197a4dfb | 167 | //無線コマンドの前にInDataExchange有線コマンド結合 |
hmizuno | 0:16a4197a4dfb | 168 | packet_command[0] = 0xD4; //コマンドコード |
hmizuno | 0:16a4197a4dfb | 169 | packet_command[1] = 0x40; //サブコマンドコード |
hmizuno | 0:16a4197a4dfb | 170 | packet_command[2] = 0x01; //Tg(InListPassiveTargetであらかじめ1枚に指定) |
hmizuno | 0:16a4197a4dfb | 171 | |
hmizuno | 0:16a4197a4dfb | 172 | for(int i = 0; i < card_command_len ; i++){ |
hmizuno | 0:16a4197a4dfb | 173 | packet_command[i + 3] = card_command[i]; |
hmizuno | 0:16a4197a4dfb | 174 | } |
hmizuno | 0:16a4197a4dfb | 175 | |
hmizuno | 0:16a4197a4dfb | 176 | //カードリーダへ送信 |
hmizuno | 0:16a4197a4dfb | 177 | sendCommand_and_RecieveRes(packet_command, (card_command_len + 3)); |
hmizuno | 0:16a4197a4dfb | 178 | |
hmizuno | 0:16a4197a4dfb | 179 | //メモリをfree |
hmizuno | 0:16a4197a4dfb | 180 | free(packet_command); |
hmizuno | 0:16a4197a4dfb | 181 | } |
hmizuno | 0:16a4197a4dfb | 182 | |
hmizuno | 0:16a4197a4dfb | 183 | |
hmizuno | 0:16a4197a4dfb | 184 | void RCS620S_AB::sendInListPasseveTarget_typeA(){ |
hmizuno | 0:16a4197a4dfb | 185 | sendCommand_and_RecieveRes(wired_data_InListPassiveTarget_typeA,(uint16_t)sizeof(wired_data_InListPassiveTarget_typeA)); |
hmizuno | 0:16a4197a4dfb | 186 | } |
hmizuno | 0:16a4197a4dfb | 187 | |
hmizuno | 0:16a4197a4dfb | 188 | void RCS620S_AB::sendInListPassiveTarget_typeB(){ |
hmizuno | 0:16a4197a4dfb | 189 | sendCommand_and_RecieveRes(wired_data_InListPassiveTarget_typeB,(uint16_t)sizeof(wired_data_InListPassiveTarget_typeB)); |
hmizuno | 0:16a4197a4dfb | 190 | } |
hmizuno | 0:16a4197a4dfb | 191 | |
hmizuno | 0:16a4197a4dfb | 192 | //private functioin |
hmizuno | 0:16a4197a4dfb | 193 | |
hmizuno | 0:16a4197a4dfb | 194 | /***************/ |
hmizuno | 0:16a4197a4dfb | 195 | /**** 制御系 ****/ |
hmizuno | 0:16a4197a4dfb | 196 | /***************/ |
hmizuno | 0:16a4197a4dfb | 197 | |
hmizuno | 0:16a4197a4dfb | 198 | void RCS620S_AB::initialize(){ |
hmizuno | 0:16a4197a4dfb | 199 | //UART受信割り込み設定 |
hmizuno | 0:16a4197a4dfb | 200 | _serial.attach(callback(this,&RCS620S_AB::serialRxIrq), Serial::RxIrq); |
hmizuno | 0:16a4197a4dfb | 201 | sendCommand_and_RecieveRes(wired_data_AdditionalTime24ms,(uint16_t)sizeof(wired_data_AdditionalTime24ms)); |
hmizuno | 0:16a4197a4dfb | 202 | } |
hmizuno | 0:16a4197a4dfb | 203 | |
hmizuno | 0:16a4197a4dfb | 204 | /***************/ |
hmizuno | 0:16a4197a4dfb | 205 | /**** 受信系 ****/ |
hmizuno | 0:16a4197a4dfb | 206 | /***************/ |
hmizuno | 0:16a4197a4dfb | 207 | |
hmizuno | 0:16a4197a4dfb | 208 | //カードリーダ UART受信割込み |
hmizuno | 0:16a4197a4dfb | 209 | //※この関数のなかでデバッグ用printf使用不可(処理中に取りこぼす) |
hmizuno | 0:16a4197a4dfb | 210 | void RCS620S_AB::serialRxIrq(){ |
hmizuno | 0:16a4197a4dfb | 211 | recieveBuffer[recieveLEN] = (uint8_t)_serial.getc(); //0 |
hmizuno | 0:16a4197a4dfb | 212 | recieveLEN++; //1 LEN = 配列番号+1 になりOK |
hmizuno | 0:16a4197a4dfb | 213 | if(recieveLEN >= READ_BUF_SIZE){ |
hmizuno | 0:16a4197a4dfb | 214 | exit(1); |
hmizuno | 0:16a4197a4dfb | 215 | } |
hmizuno | 0:16a4197a4dfb | 216 | } |
hmizuno | 0:16a4197a4dfb | 217 | |
hmizuno | 0:16a4197a4dfb | 218 | void RCS620S_AB::clearRecieveBuffer(){ |
hmizuno | 0:16a4197a4dfb | 219 | //受信バッファカーソル位置を先頭に |
hmizuno | 0:16a4197a4dfb | 220 | recieveLEN = 0; |
hmizuno | 0:16a4197a4dfb | 221 | |
hmizuno | 0:16a4197a4dfb | 222 | //受信バッファをクリア |
hmizuno | 0:16a4197a4dfb | 223 | for(int i = 0; i < READ_BUF_SIZE; i++){ |
hmizuno | 0:16a4197a4dfb | 224 | recieveBuffer[i] = 0x00; |
hmizuno | 0:16a4197a4dfb | 225 | } |
hmizuno | 0:16a4197a4dfb | 226 | } |
hmizuno | 0:16a4197a4dfb | 227 | |
hmizuno | 0:16a4197a4dfb | 228 | //読み取り完了まで待機 |
hmizuno | 0:16a4197a4dfb | 229 | //ACK受信後、一定時間経過しても受信文字数が増えなくなる(=RX割り込みがかからない=受信完了)まで待機 |
hmizuno | 0:16a4197a4dfb | 230 | void RCS620S_AB::waitWhileRead(int cycleTime_ms){ |
hmizuno | 0:16a4197a4dfb | 231 | |
hmizuno | 0:16a4197a4dfb | 232 | int cTime; |
hmizuno | 0:16a4197a4dfb | 233 | if(cycleTime_ms >= 1){ |
hmizuno | 0:16a4197a4dfb | 234 | cTime = cycleTime_ms; |
hmizuno | 0:16a4197a4dfb | 235 | }else{ |
hmizuno | 0:16a4197a4dfb | 236 | cTime = 1; |
hmizuno | 0:16a4197a4dfb | 237 | } |
hmizuno | 0:16a4197a4dfb | 238 | |
hmizuno | 0:16a4197a4dfb | 239 | //ackはmax3.5ms |
hmizuno | 0:16a4197a4dfb | 240 | int l; |
hmizuno | 0:16a4197a4dfb | 241 | do{ |
hmizuno | 0:16a4197a4dfb | 242 | l = recieveLEN; //現在の受信文字数 |
hmizuno | 0:16a4197a4dfb | 243 | wait_ms(cTime); |
hmizuno | 0:16a4197a4dfb | 244 | }while(recieveLEN <= sizeof(wired_complete_ACK) || l < recieveLEN);//一定時間後の受信文字数と比較 |
hmizuno | 0:16a4197a4dfb | 245 | } |
hmizuno | 0:16a4197a4dfb | 246 | |
hmizuno | 0:16a4197a4dfb | 247 | //受信バッファからrecieveBuffer[start] ~ recieveBuffer[end] を抜き出す |
hmizuno | 0:16a4197a4dfb | 248 | void RCS620S_AB::extractRes(int start, int end, uint8_t ansArray[], int *ansLen){ |
hmizuno | 0:16a4197a4dfb | 249 | if(end > recieveLEN || start > end){ |
hmizuno | 0:16a4197a4dfb | 250 | *ansLen = 0; |
hmizuno | 0:16a4197a4dfb | 251 | }else{ |
hmizuno | 0:16a4197a4dfb | 252 | int j = 0; |
hmizuno | 0:16a4197a4dfb | 253 | for(int i = start; i <= end; i++){ |
hmizuno | 0:16a4197a4dfb | 254 | ansArray[j] = recieveBuffer[i]; |
hmizuno | 0:16a4197a4dfb | 255 | j++; |
hmizuno | 0:16a4197a4dfb | 256 | } |
hmizuno | 0:16a4197a4dfb | 257 | *ansLen = end - start + 1; |
hmizuno | 0:16a4197a4dfb | 258 | } |
hmizuno | 0:16a4197a4dfb | 259 | } |
hmizuno | 0:16a4197a4dfb | 260 | |
hmizuno | 0:16a4197a4dfb | 261 | /***************/ |
hmizuno | 0:16a4197a4dfb | 262 | /**** 検査系 ****/ |
hmizuno | 0:16a4197a4dfb | 263 | /***************/ |
hmizuno | 0:16a4197a4dfb | 264 | |
hmizuno | 0:16a4197a4dfb | 265 | //頭についているACKが仕様書記載通りのデータになっているか確認 |
hmizuno | 0:16a4197a4dfb | 266 | bool RCS620S_AB::checkACK(){ |
hmizuno | 0:16a4197a4dfb | 267 | bool flag = true; |
hmizuno | 0:16a4197a4dfb | 268 | for(int i = 0; i<sizeof(wired_complete_ACK); i++){ |
hmizuno | 0:16a4197a4dfb | 269 | if(wired_complete_ACK[i] != recieveBuffer[i]){ |
hmizuno | 0:16a4197a4dfb | 270 | flag = false; |
hmizuno | 0:16a4197a4dfb | 271 | } |
hmizuno | 0:16a4197a4dfb | 272 | } |
hmizuno | 0:16a4197a4dfb | 273 | return flag; |
hmizuno | 0:16a4197a4dfb | 274 | } |
hmizuno | 0:16a4197a4dfb | 275 | |
hmizuno | 0:16a4197a4dfb | 276 | |
hmizuno | 0:16a4197a4dfb | 277 | bool RCS620S_AB::checkCardRes(){ |
hmizuno | 0:16a4197a4dfb | 278 | //inListPassiveTargetの場合 D5 4B Tg [CardRes] DCS |
hmizuno | 0:16a4197a4dfb | 279 | //inDataExchangeの場合 D5 41 Status [CardRes] DCS |
hmizuno | 0:16a4197a4dfb | 280 | |
hmizuno | 0:16a4197a4dfb | 281 | //そもそも受信できてなければエラー |
hmizuno | 0:16a4197a4dfb | 282 | if(checkRxData_and_getLEN() < 1){ |
hmizuno | 0:16a4197a4dfb | 283 | return false; |
hmizuno | 0:16a4197a4dfb | 284 | } |
hmizuno | 0:16a4197a4dfb | 285 | |
hmizuno | 0:16a4197a4dfb | 286 | //使う頻度が多いinDataExchangeを先に評価 |
hmizuno | 0:16a4197a4dfb | 287 | if(recieveBuffer[12] == 0x41 && recieveBuffer[13] == 0x00){ |
hmizuno | 0:16a4197a4dfb | 288 | //inListpassiveTargetレスポンス(0x41)ならばターゲットidが0x01かチェック |
hmizuno | 0:16a4197a4dfb | 289 | return true; |
hmizuno | 0:16a4197a4dfb | 290 | }else if(recieveBuffer[12] == 0x4B && recieveBuffer[13] == 0x01){ |
hmizuno | 0:16a4197a4dfb | 291 | //inListpassiveTargetレスポンス(0x4B)ならばターゲットidが0x01かチェック |
hmizuno | 0:16a4197a4dfb | 292 | return true; |
hmizuno | 0:16a4197a4dfb | 293 | }else{ |
hmizuno | 0:16a4197a4dfb | 294 | return false; |
hmizuno | 0:16a4197a4dfb | 295 | } |
hmizuno | 0:16a4197a4dfb | 296 | } |
hmizuno | 0:16a4197a4dfb | 297 | |
hmizuno | 0:16a4197a4dfb | 298 | |
hmizuno | 0:16a4197a4dfb | 299 | //受信データをチェックしてOKならLENを返す、異常なら0を返す |
hmizuno | 0:16a4197a4dfb | 300 | uint8_t RCS620S_AB::checkRxData_and_getLEN(){ |
hmizuno | 0:16a4197a4dfb | 301 | |
hmizuno | 0:16a4197a4dfb | 302 | //頭にACKが付いているかチェック |
hmizuno | 0:16a4197a4dfb | 303 | if(!checkACK()){ |
hmizuno | 0:16a4197a4dfb | 304 | return 0; |
hmizuno | 0:16a4197a4dfb | 305 | } |
hmizuno | 0:16a4197a4dfb | 306 | |
hmizuno | 0:16a4197a4dfb | 307 | //LEN+LCSをチェックしてLENを取得 |
hmizuno | 0:16a4197a4dfb | 308 | uint8_t data_len = 0; |
hmizuno | 0:16a4197a4dfb | 309 | |
hmizuno | 0:16a4197a4dfb | 310 | uint8_t recieved_LEN_check = (uint8_t)(0x00ff & (recieveBuffer[9]+recieveBuffer[10])); |
hmizuno | 0:16a4197a4dfb | 311 | if(recieved_LEN_check == 0x00 && recieveBuffer[9] > 0x00){ |
hmizuno | 0:16a4197a4dfb | 312 | data_len = recieveBuffer[9]; |
hmizuno | 0:16a4197a4dfb | 313 | }else{ |
hmizuno | 0:16a4197a4dfb | 314 | //LEN受信エラー |
hmizuno | 0:16a4197a4dfb | 315 | return 0; |
hmizuno | 0:16a4197a4dfb | 316 | } |
hmizuno | 0:16a4197a4dfb | 317 | |
hmizuno | 0:16a4197a4dfb | 318 | //レスポンスコードをチェック |
hmizuno | 0:16a4197a4dfb | 319 | if(recieveBuffer[11] != 0xD5){ |
hmizuno | 0:16a4197a4dfb | 320 | //レスポンスコードが 0xD5 でない |
hmizuno | 0:16a4197a4dfb | 321 | return 0; |
hmizuno | 0:16a4197a4dfb | 322 | } |
hmizuno | 0:16a4197a4dfb | 323 | |
hmizuno | 0:16a4197a4dfb | 324 | //DCSをチェック |
hmizuno | 0:16a4197a4dfb | 325 | uint32_t data_sum = 0x00000000; |
hmizuno | 0:16a4197a4dfb | 326 | for(int i = 11; i < 11 + data_len; i++){ |
hmizuno | 0:16a4197a4dfb | 327 | data_sum = data_sum + recieveBuffer[i]; |
hmizuno | 0:16a4197a4dfb | 328 | } |
hmizuno | 0:16a4197a4dfb | 329 | data_sum = 0x000000FF & data_sum; |
hmizuno | 0:16a4197a4dfb | 330 | //データ合計にDCSを足す |
hmizuno | 0:16a4197a4dfb | 331 | data_sum = data_sum + recieveBuffer[11 + data_len]; |
hmizuno | 0:16a4197a4dfb | 332 | |
hmizuno | 0:16a4197a4dfb | 333 | if(data_sum == 0x100){ |
hmizuno | 0:16a4197a4dfb | 334 | //LENを返す |
hmizuno | 0:16a4197a4dfb | 335 | return data_len; |
hmizuno | 0:16a4197a4dfb | 336 | }else{ |
hmizuno | 0:16a4197a4dfb | 337 | //データ受信エラー |
hmizuno | 0:16a4197a4dfb | 338 | return 0; |
hmizuno | 0:16a4197a4dfb | 339 | } |
hmizuno | 0:16a4197a4dfb | 340 | } |