NFCカードリーダー(RC-S620/S)とリレーを組み合わせ、日本の運転免許証をタッチしないとエンジンがかからない制御をします。動画でご紹介した無免許運転防止・免許不携帯防止システムのソースコードです。

Dependencies:   mbed ATP301x_SPI PwmBeep RCS620_AB

Committer:
hmizuno
Date:
Sun Jun 07 02:06:15 2020 +0000
Revision:
1:d52c0ea6e922
Parent:
0:8e6f778abf78
Ver_0_0_9_1 Add Audio Sleep

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hmizuno 0:8e6f778abf78 1 /**
hmizuno 0:8e6f778abf78 2 * DLC(Driver's License Card)スターター Standard
hmizuno 0:8e6f778abf78 3 *
hmizuno 0:8e6f778abf78 4 * 青mbed用 RTCを使用する標準バージョン
hmizuno 0:8e6f778abf78 5 *
hmizuno 1:d52c0ea6e922 6 * 2020/5/29 Ver 0.9 初回公開
hmizuno 1:d52c0ea6e922 7 * 2020/6/7 Ver 0.91 音声回路スリープ追加
hmizuno 0:8e6f778abf78 8 *
hmizuno 0:8e6f778abf78 9 **/
hmizuno 0:8e6f778abf78 10
hmizuno 0:8e6f778abf78 11
hmizuno 0:8e6f778abf78 12 //公式ヘッダファイル
hmizuno 0:8e6f778abf78 13 #include "mbed.h"
hmizuno 0:8e6f778abf78 14 #include "stdint.h"
hmizuno 0:8e6f778abf78 15 #include "string.h"
hmizuno 0:8e6f778abf78 16 #include "Stream.h"
hmizuno 0:8e6f778abf78 17 #include "time.h"
hmizuno 0:8e6f778abf78 18
hmizuno 0:8e6f778abf78 19 //コマンドは別ファイルへ保存
hmizuno 0:8e6f778abf78 20 #include "dlcCommand.h"
hmizuno 0:8e6f778abf78 21
hmizuno 0:8e6f778abf78 22 //自作ライブラリ
hmizuno 0:8e6f778abf78 23 #include "ATP301x_SPI.h"
hmizuno 0:8e6f778abf78 24 #include "PwmBeep.h"
hmizuno 0:8e6f778abf78 25 #include "RCS620S_AB.h"
hmizuno 0:8e6f778abf78 26
hmizuno 0:8e6f778abf78 27 //TeraTermへデバッグ表示する場合1、しない場合0
hmizuno 0:8e6f778abf78 28 #define SHOW_DEBUG 0
hmizuno 0:8e6f778abf78 29
hmizuno 0:8e6f778abf78 30 //音声合成LSIを使う場合1、使わない場合0
hmizuno 0:8e6f778abf78 31 #define USE_ATP301X 1
hmizuno 0:8e6f778abf78 32
hmizuno 0:8e6f778abf78 33 //警告・メッセージビープ周波数
hmizuno 0:8e6f778abf78 34 #define BEEP_FREQ 880
hmizuno 0:8e6f778abf78 35
hmizuno 0:8e6f778abf78 36 //始動OKビープ周波数
hmizuno 0:8e6f778abf78 37 #define BEEP_FREQ_AFTER_READ 1320
hmizuno 0:8e6f778abf78 38
hmizuno 0:8e6f778abf78 39 //有効期限当日の何時を期限切れとして扱うか(24h表記)
hmizuno 0:8e6f778abf78 40 #define KIGENGIRETOSURUJIKOKU_H 12
hmizuno 0:8e6f778abf78 41
hmizuno 0:8e6f778abf78 42
hmizuno 0:8e6f778abf78 43 /****************************/
hmizuno 0:8e6f778abf78 44 /* グローバル変数とハードウェア */
hmizuno 0:8e6f778abf78 45 /****************************/
hmizuno 0:8e6f778abf78 46
hmizuno 0:8e6f778abf78 47
hmizuno 0:8e6f778abf78 48 //デバッグ用PC(mbed公式サイトからドライバのダウンロードが必要です)
hmizuno 0:8e6f778abf78 49 //ドライバ:https://os.mbed.com/docs/mbed-os/v5.15/tutorials/windows-serial-driver.html
hmizuno 0:8e6f778abf78 50 Serial pc(USBTX,USBRX);
hmizuno 0:8e6f778abf78 51
hmizuno 1:d52c0ea6e922 52 //カードリーダー (tx,rx)
hmizuno 0:8e6f778abf78 53 RCS620S_AB rcs620(p28,p27);
hmizuno 0:8e6f778abf78 54
hmizuno 1:d52c0ea6e922 55 //音声合成LSI (misi,miso,sck,nss)
hmizuno 0:8e6f778abf78 56 ATP301x_SPI atp301x(p11, p12, p13, p14);
hmizuno 0:8e6f778abf78 57
hmizuno 0:8e6f778abf78 58 //スターター遮断リレー制御出力
hmizuno 0:8e6f778abf78 59 DigitalOut relay(p30);
hmizuno 0:8e6f778abf78 60
hmizuno 1:d52c0ea6e922 61 //ビープ(圧電スピーカー)出力 (pwmout)
hmizuno 1:d52c0ea6e922 62 PwmBeep beep(p21);
hmizuno 1:d52c0ea6e922 63
hmizuno 1:d52c0ea6e922 64 //オーディオ回路電源制御
hmizuno 1:d52c0ea6e922 65 DigitalOut nAtpSleep(p22);
hmizuno 1:d52c0ea6e922 66 DigitalOut afAmpSleep(p23);
hmizuno 1:d52c0ea6e922 67
hmizuno 0:8e6f778abf78 68 //警告ブザー入力
hmizuno 1:d52c0ea6e922 69 InterruptIn ig_start_sw(p24);
hmizuno 0:8e6f778abf78 70
hmizuno 0:8e6f778abf78 71 //LED
hmizuno 0:8e6f778abf78 72 DigitalOut myled1(LED1);
hmizuno 0:8e6f778abf78 73 DigitalOut myled2(LED2);
hmizuno 0:8e6f778abf78 74 DigitalOut myled3(LED3);
hmizuno 0:8e6f778abf78 75 DigitalOut myled4(LED4);
hmizuno 0:8e6f778abf78 76
hmizuno 0:8e6f778abf78 77 //共通データ要素の中身整理用構造体
hmizuno 0:8e6f778abf78 78 //※有効期限しか使いませんが、RFUとして全てのデータを整理しておきます。
hmizuno 0:8e6f778abf78 79 typedef struct{
hmizuno 0:8e6f778abf78 80 uint8_t shiyoVer[3];
hmizuno 0:8e6f778abf78 81 uint8_t kofuYYYYMMDD[4];
hmizuno 0:8e6f778abf78 82 uint8_t yukoYYYYMMDD[4];
hmizuno 0:8e6f778abf78 83 }mfDataStruct;
hmizuno 0:8e6f778abf78 84
hmizuno 0:8e6f778abf78 85 /****************************************************************************/
hmizuno 0:8e6f778abf78 86
hmizuno 0:8e6f778abf78 87 /******************/
hmizuno 0:8e6f778abf78 88 /* プロトタイプ宣言 */
hmizuno 0:8e6f778abf78 89 /******************/
hmizuno 0:8e6f778abf78 90
hmizuno 0:8e6f778abf78 91 //制御系
hmizuno 0:8e6f778abf78 92 void allowDrive();
hmizuno 0:8e6f778abf78 93 void disallowDrive();
hmizuno 0:8e6f778abf78 94 void reset();
hmizuno 1:d52c0ea6e922 95 void audioOn();
hmizuno 1:d52c0ea6e922 96 void audioOff();
hmizuno 0:8e6f778abf78 97 void announcePleaseTouch();
hmizuno 0:8e6f778abf78 98 void igswRiseIrq();
hmizuno 0:8e6f778abf78 99 void errorBeep(int);
hmizuno 0:8e6f778abf78 100
hmizuno 0:8e6f778abf78 101 //送信系
hmizuno 0:8e6f778abf78 102 void sendSELECTbyAID(const uint8_t*, bool);
hmizuno 0:8e6f778abf78 103
hmizuno 0:8e6f778abf78 104 //検査系
hmizuno 0:8e6f778abf78 105 bool checkATQB(uint8_t*, int);
hmizuno 0:8e6f778abf78 106 bool checkSELECTres(uint8_t*, int);
hmizuno 0:8e6f778abf78 107 bool checkREAD_BINARYres(uint8_t*, int);
hmizuno 0:8e6f778abf78 108 bool isEfectiveLicenseCard(tm);
hmizuno 0:8e6f778abf78 109
hmizuno 0:8e6f778abf78 110 //時刻系
hmizuno 0:8e6f778abf78 111 void setRTCfromUSBPC();
hmizuno 0:8e6f778abf78 112 void setDummyRTC();
hmizuno 0:8e6f778abf78 113 bool isSetRTC();
hmizuno 0:8e6f778abf78 114 int packedBCDtoInt(uint8_t);
hmizuno 0:8e6f778abf78 115 tm packedBCDdata_to_tmStruct(uint8_t*);
hmizuno 0:8e6f778abf78 116 mfDataStruct mfData_toStruct(uint8_t*, int);
hmizuno 0:8e6f778abf78 117
hmizuno 0:8e6f778abf78 118 //表示機能
hmizuno 0:8e6f778abf78 119 void debugPrintAllRxData();
hmizuno 0:8e6f778abf78 120 void debugPrintATQB(uint8_t*);
hmizuno 0:8e6f778abf78 121 void debugPrintMFdata(uint8_t*);
hmizuno 0:8e6f778abf78 122
hmizuno 0:8e6f778abf78 123 /****************************************************************************/
hmizuno 0:8e6f778abf78 124
hmizuno 0:8e6f778abf78 125 /************/
hmizuno 0:8e6f778abf78 126 /*** main ***/
hmizuno 0:8e6f778abf78 127 /************/
hmizuno 0:8e6f778abf78 128
hmizuno 0:8e6f778abf78 129 int main() {
hmizuno 0:8e6f778abf78 130 //起動処理
hmizuno 1:d52c0ea6e922 131 disallowDrive();
hmizuno 1:d52c0ea6e922 132 audioOn();
hmizuno 1:d52c0ea6e922 133
hmizuno 0:8e6f778abf78 134 bool canDrive = false;
hmizuno 0:8e6f778abf78 135 char atpbuf[ATP_MAX_LEN];
hmizuno 0:8e6f778abf78 136
hmizuno 0:8e6f778abf78 137 uint8_t* resArray = new uint8_t[rcs620.RETURN_ENVELOPE_SIZE];
hmizuno 0:8e6f778abf78 138 int resLen;
hmizuno 0:8e6f778abf78 139
hmizuno 0:8e6f778abf78 140 ig_start_sw.mode (PullDown);
hmizuno 0:8e6f778abf78 141
hmizuno 0:8e6f778abf78 142 //内蔵RTC(リアルタイムクロックモジュール)がリセットされていたら時刻設定モードへ入る
hmizuno 0:8e6f778abf78 143 if(!isSetRTC()){
hmizuno 0:8e6f778abf78 144 //setRTCfromUSBPC();
hmizuno 0:8e6f778abf78 145
hmizuno 0:8e6f778abf78 146 //とりあえず時計はダミーデータを設定
hmizuno 0:8e6f778abf78 147 setDummyRTC();
hmizuno 0:8e6f778abf78 148 }
hmizuno 0:8e6f778abf78 149
hmizuno 0:8e6f778abf78 150 while(!canDrive){
hmizuno 0:8e6f778abf78 151 beep.setFreq(BEEP_FREQ);
hmizuno 0:8e6f778abf78 152 reset();
hmizuno 0:8e6f778abf78 153
hmizuno 0:8e6f778abf78 154 //マイコン起動より早くキーひねると割り込みかからないから初回手動でブザー鳴らす
hmizuno 0:8e6f778abf78 155 if(ig_start_sw.read()){
hmizuno 0:8e6f778abf78 156 beep.turnOn();
hmizuno 0:8e6f778abf78 157 }
hmizuno 0:8e6f778abf78 158
hmizuno 0:8e6f778abf78 159 ig_start_sw.rise(&igswRiseIrq);
hmizuno 0:8e6f778abf78 160 ig_start_sw.fall(callback(&beep, &PwmBeep::turnOff));
hmizuno 0:8e6f778abf78 161
hmizuno 0:8e6f778abf78 162 //音声合成「免許証をタッチしてください」
hmizuno 0:8e6f778abf78 163 announcePleaseTouch();
hmizuno 0:8e6f778abf78 164
hmizuno 0:8e6f778abf78 165 //NFC Type-Bをポーリング
hmizuno 0:8e6f778abf78 166 if(SHOW_DEBUG){pc.printf("Polling NFC-TypeB\r\n");}
hmizuno 0:8e6f778abf78 167
hmizuno 0:8e6f778abf78 168 rcs620.sendInListPassiveTarget_typeB();
hmizuno 0:8e6f778abf78 169
hmizuno 0:8e6f778abf78 170 //警報割り込み解除
hmizuno 0:8e6f778abf78 171 ig_start_sw.rise(callback(&beep, &PwmBeep::turnOff));
hmizuno 0:8e6f778abf78 172 beep.turnOff();
hmizuno 0:8e6f778abf78 173
hmizuno 0:8e6f778abf78 174 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 175 //タッチ音「ポーン」
hmizuno 0:8e6f778abf78 176 atp301x.chimeJ(false);
hmizuno 0:8e6f778abf78 177 }else{
hmizuno 0:8e6f778abf78 178 //ビープ「ピッ」
hmizuno 0:8e6f778abf78 179 beep.oneshotOn(0.1);
hmizuno 0:8e6f778abf78 180 }
hmizuno 0:8e6f778abf78 181
hmizuno 0:8e6f778abf78 182 //ポーリングレスポンス読み出し
hmizuno 0:8e6f778abf78 183 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 184
hmizuno 0:8e6f778abf78 185 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 186 debugPrintATQB(resArray);
hmizuno 0:8e6f778abf78 187
hmizuno 0:8e6f778abf78 188 //免許証判定STEP1 ATQBをチェック
hmizuno 0:8e6f778abf78 189
hmizuno 0:8e6f778abf78 190 if(!checkATQB(resArray, resLen)){
hmizuno 0:8e6f778abf78 191 //ビープ「ピーピー」
hmizuno 0:8e6f778abf78 192 errorBeep(2);
hmizuno 0:8e6f778abf78 193 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 194 //音声合成「ATQB応用データ照合失敗」
hmizuno 0:8e6f778abf78 195 atp301x.talk("<ALPHA VAL=ATQB>/o-yo-de'-ta/sho-go-shippai.");
hmizuno 0:8e6f778abf78 196 }
hmizuno 0:8e6f778abf78 197 continue;
hmizuno 0:8e6f778abf78 198 }
hmizuno 0:8e6f778abf78 199
hmizuno 0:8e6f778abf78 200 //免許証判定STEP2 3つのAIDが存在するかチェック
hmizuno 0:8e6f778abf78 201
hmizuno 0:8e6f778abf78 202 //DF1があるか確認
hmizuno 0:8e6f778abf78 203 sendSELECTbyAID(dlc_DF1_AID, false);
hmizuno 0:8e6f778abf78 204
hmizuno 0:8e6f778abf78 205 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 206
hmizuno 0:8e6f778abf78 207 if(SHOW_DEBUG){pc.printf("\r\nDF1 AID check All Received Packet = \r\n");}
hmizuno 0:8e6f778abf78 208 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 209
hmizuno 0:8e6f778abf78 210 if(!checkSELECTres(resArray, resLen)){
hmizuno 0:8e6f778abf78 211 //ビープ「ピーピーピー」
hmizuno 0:8e6f778abf78 212 errorBeep(3);
hmizuno 0:8e6f778abf78 213 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 214 //音声合成「DF1 照合失敗」
hmizuno 0:8e6f778abf78 215 atp301x.talk("<ALPHA VAL=DF1>/sho-go-shippai.\r\0");
hmizuno 0:8e6f778abf78 216 }
hmizuno 0:8e6f778abf78 217 continue;
hmizuno 0:8e6f778abf78 218 }
hmizuno 0:8e6f778abf78 219
hmizuno 0:8e6f778abf78 220 //AID2があるか確認
hmizuno 0:8e6f778abf78 221 sendSELECTbyAID(dlc_DF2_AID, false);
hmizuno 0:8e6f778abf78 222 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 223
hmizuno 0:8e6f778abf78 224 if(SHOW_DEBUG){pc.printf("\r\nDF2 AID check All Received Packet = \r\n");}
hmizuno 0:8e6f778abf78 225 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 226
hmizuno 0:8e6f778abf78 227 if(!checkSELECTres(resArray, resLen)){
hmizuno 0:8e6f778abf78 228 //ビープ「ピーピーピー」
hmizuno 0:8e6f778abf78 229 errorBeep(3);
hmizuno 0:8e6f778abf78 230 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 231 //音声合成「DF2 照合失敗」
hmizuno 0:8e6f778abf78 232 atp301x.talk("<ALPHA VAL=DF2>/sho-go-shippai.\r\0");
hmizuno 0:8e6f778abf78 233 }
hmizuno 0:8e6f778abf78 234 continue;
hmizuno 0:8e6f778abf78 235 }
hmizuno 0:8e6f778abf78 236
hmizuno 0:8e6f778abf78 237 //AID3があるか確認
hmizuno 0:8e6f778abf78 238 sendSELECTbyAID(dlc_DF3_AID, false);
hmizuno 0:8e6f778abf78 239 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 240
hmizuno 0:8e6f778abf78 241 if(SHOW_DEBUG){pc.printf("\r\nDF3 AID check All Received Packet = \r\n");}
hmizuno 0:8e6f778abf78 242 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 243
hmizuno 0:8e6f778abf78 244 if(!checkSELECTres(resArray, resLen)){
hmizuno 0:8e6f778abf78 245 //ビープ「ピーピーピー」
hmizuno 0:8e6f778abf78 246 errorBeep(3);
hmizuno 0:8e6f778abf78 247 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 248 //音声合成「DF3 照合失敗」
hmizuno 0:8e6f778abf78 249 atp301x.talk("<ALPHA VAL=DF3>/sho-go-shippai.\r\0");
hmizuno 0:8e6f778abf78 250 }
hmizuno 0:8e6f778abf78 251 continue;
hmizuno 0:8e6f778abf78 252 }
hmizuno 0:8e6f778abf78 253
hmizuno 0:8e6f778abf78 254 //ここまで来られたらタッチされたカードは免許証!
hmizuno 0:8e6f778abf78 255 //共通データ要素読み出し
hmizuno 0:8e6f778abf78 256
hmizuno 0:8e6f778abf78 257 //MFを選択
hmizuno 0:8e6f778abf78 258 rcs620.sendInDataExchange_and_RecieveRes(wireless_SELECT_MF,(uint16_t)sizeof(wireless_SELECT_MF));
hmizuno 0:8e6f778abf78 259 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 260
hmizuno 0:8e6f778abf78 261 if(SHOW_DEBUG){pc.printf("\r\nMF SELECT All Received Packet = \r\n");}
hmizuno 0:8e6f778abf78 262 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 263
hmizuno 0:8e6f778abf78 264 if(!checkSELECTres(resArray, resLen)){
hmizuno 0:8e6f778abf78 265 //ビープ「ピーピーピーピー」
hmizuno 0:8e6f778abf78 266 errorBeep(4);
hmizuno 0:8e6f778abf78 267 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 268 //音声合成「MF選択失敗」
hmizuno 0:8e6f778abf78 269 atp301x.talk("<ALPHA VAL=MF>se'nnta_ku/shippai.\r\0");
hmizuno 0:8e6f778abf78 270 }
hmizuno 0:8e6f778abf78 271 continue;
hmizuno 0:8e6f778abf78 272 }
hmizuno 0:8e6f778abf78 273
hmizuno 0:8e6f778abf78 274
hmizuno 0:8e6f778abf78 275 //MF内のEF01を選択
hmizuno 0:8e6f778abf78 276 rcs620.sendInDataExchange_and_RecieveRes(wireless_SELECT_EF01_whileMFselected,(uint16_t)sizeof(wireless_SELECT_EF01_whileMFselected));
hmizuno 0:8e6f778abf78 277 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 278
hmizuno 0:8e6f778abf78 279 if(SHOW_DEBUG){pc.printf("\r\nEF01 SELECT All Received Packet = \r\n");}
hmizuno 0:8e6f778abf78 280 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 281
hmizuno 0:8e6f778abf78 282 if(!checkSELECTres(resArray, resLen)){
hmizuno 0:8e6f778abf78 283 //ビープ「ピーピーピーピー」
hmizuno 0:8e6f778abf78 284 errorBeep(4);
hmizuno 0:8e6f778abf78 285 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 286 //音声合成「EF01選択失敗」
hmizuno 0:8e6f778abf78 287 atp301x.talk("<ALPHA VAL=EF01>/sennta_ku/shippai.\r\0");
hmizuno 0:8e6f778abf78 288 }
hmizuno 0:8e6f778abf78 289 continue;
hmizuno 0:8e6f778abf78 290 }
hmizuno 0:8e6f778abf78 291
hmizuno 0:8e6f778abf78 292
hmizuno 0:8e6f778abf78 293 //EF01(共通データ要素)をREAD BINARY
hmizuno 0:8e6f778abf78 294 rcs620.sendInDataExchange_and_RecieveRes(wireless_READ_BINARY_noOffset_255,(uint16_t)sizeof(wireless_READ_BINARY_noOffset_255));
hmizuno 0:8e6f778abf78 295 rcs620.getCardRes(resArray, &resLen);
hmizuno 0:8e6f778abf78 296
hmizuno 0:8e6f778abf78 297 if(SHOW_DEBUG){pc.printf("\r\nREAD BINARY All Received Packet = \r\n");}
hmizuno 0:8e6f778abf78 298 debugPrintAllRxData();
hmizuno 0:8e6f778abf78 299
hmizuno 0:8e6f778abf78 300 //ステータスが正常か確認
hmizuno 0:8e6f778abf78 301 if(!checkREAD_BINARYres(resArray, resLen)){
hmizuno 0:8e6f778abf78 302 //ビープ「ピーピーピーピーピー」
hmizuno 0:8e6f778abf78 303 errorBeep(5);
hmizuno 0:8e6f778abf78 304 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 305 //音声合成「共通データ要素読み取り失敗」
hmizuno 0:8e6f778abf78 306 atp301x.talk("kyo-tsu-de-tayo'-so/yomitori/shippai.\r\0");
hmizuno 0:8e6f778abf78 307 }
hmizuno 0:8e6f778abf78 308 continue;
hmizuno 0:8e6f778abf78 309 }
hmizuno 0:8e6f778abf78 310
hmizuno 0:8e6f778abf78 311 //データ長が短すぎないか確認
hmizuno 0:8e6f778abf78 312 //※将来的に暗証番号の領域を使えるようcheckREAD_BINARYres関数の外で確認してます
hmizuno 0:8e6f778abf78 313 if(resLen < 19){
hmizuno 0:8e6f778abf78 314 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 315 //音声合成「共通データ要素読み取り失敗」
hmizuno 0:8e6f778abf78 316 atp301x.talk("kyo-tsu-de-tayo'-so/yomitori/shippai.\r\0");
hmizuno 0:8e6f778abf78 317 }
hmizuno 0:8e6f778abf78 318 continue;
hmizuno 0:8e6f778abf78 319 }
hmizuno 0:8e6f778abf78 320
hmizuno 0:8e6f778abf78 321
hmizuno 0:8e6f778abf78 322 debugPrintMFdata(resArray);
hmizuno 0:8e6f778abf78 323
hmizuno 0:8e6f778abf78 324 //共通データ要素の中身チェック
hmizuno 0:8e6f778abf78 325
hmizuno 0:8e6f778abf78 326 //共通データ要素の中身を分割して構造体へ保存
hmizuno 0:8e6f778abf78 327 mfDataStruct mfData;
hmizuno 0:8e6f778abf78 328 mfData = mfData_toStruct(resArray, resLen);
hmizuno 0:8e6f778abf78 329
hmizuno 0:8e6f778abf78 330 //パック2進化10進数形式の有効期限をC標準の tm 構造体へ変換
hmizuno 0:8e6f778abf78 331 tm yukoKigen_tm;
hmizuno 0:8e6f778abf78 332 yukoKigen_tm = packedBCDdata_to_tmStruct(mfData.yukoYYYYMMDD);
hmizuno 0:8e6f778abf78 333
hmizuno 0:8e6f778abf78 334 if(isEfectiveLicenseCard(yukoKigen_tm)){
hmizuno 0:8e6f778abf78 335 allowDrive();
hmizuno 0:8e6f778abf78 336
hmizuno 0:8e6f778abf78 337 //ループ終わり
hmizuno 0:8e6f778abf78 338 canDrive = true;
hmizuno 0:8e6f778abf78 339
hmizuno 0:8e6f778abf78 340 //ビープ「ピッ(高音)」
hmizuno 0:8e6f778abf78 341 beep.setFreq(BEEP_FREQ_AFTER_READ);
hmizuno 0:8e6f778abf78 342 beep.oneshotOn(0.1);
hmizuno 0:8e6f778abf78 343 }else{
hmizuno 0:8e6f778abf78 344 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 345 //音声合成「有効期限が切れいてるか、時計がズレています」
hmizuno 0:8e6f778abf78 346 atp301x.talk("yu-ko-ki'gennga/ki'rete+iru'ka toke-ga/zu'rete+ima_su.\r\0");
hmizuno 0:8e6f778abf78 347
hmizuno 0:8e6f778abf78 348 //RTC時刻読み上げ
hmizuno 0:8e6f778abf78 349 time_t seconds = time(NULL); //read RTC as UNIX time data
hmizuno 0:8e6f778abf78 350 struct tm *t = localtime(&seconds);
hmizuno 0:8e6f778abf78 351
hmizuno 0:8e6f778abf78 352 //音声合成「RTC時刻は」
hmizuno 0:8e6f778abf78 353 atp301x.talk("a-ruthi-shi'-/ji'kokuwa.\r\0");
hmizuno 0:8e6f778abf78 354 //音声合成「_年_月_日」
hmizuno 0:8e6f778abf78 355 sprintf(atpbuf,"<NUMK VAL=%d COUNTER=nenn>/<NUMK VAL=%d COUNTER=gatu>/<NUMK VAL=%d COUNTER=nichi>.\r",t->tm_year+1900,t->tm_mon+1,t->tm_mday);
hmizuno 0:8e6f778abf78 356 atp301x.talk(atpbuf);
hmizuno 0:8e6f778abf78 357 //音声合成「_時_分_秒です」
hmizuno 0:8e6f778abf78 358 sprintf(atpbuf,"<NUMK VAL=%d COUNTER=ji>/<NUMK VAL=%d COUNTER=funn>/de_su.\r",t->tm_hour,t->tm_min);
hmizuno 0:8e6f778abf78 359 atp301x.talk(atpbuf);
hmizuno 0:8e6f778abf78 360 }
hmizuno 0:8e6f778abf78 361 }
hmizuno 0:8e6f778abf78 362
hmizuno 0:8e6f778abf78 363 //有効期限読み上げ
hmizuno 0:8e6f778abf78 364
hmizuno 0:8e6f778abf78 365 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 366 //音声合成「有効期限は_年_月_日です」
hmizuno 0:8e6f778abf78 367 sprintf(atpbuf,"yu-ko-ki'gennwa <NUMK VAL=%d COUNTER=nenn>/<NUMK VAL=%d COUNTER=gatu>/<NUMK VAL=%d COUNTER=nichi>/de_su.\r",
hmizuno 0:8e6f778abf78 368 yukoKigen_tm.tm_year+1900, yukoKigen_tm.tm_mon+1, yukoKigen_tm.tm_mday);
hmizuno 0:8e6f778abf78 369 atp301x.talk(atpbuf,true);
hmizuno 0:8e6f778abf78 370 }
hmizuno 0:8e6f778abf78 371 }//while終わり
hmizuno 0:8e6f778abf78 372
hmizuno 0:8e6f778abf78 373 //カードリーダの電源OFF
hmizuno 0:8e6f778abf78 374 rcs620.powerDown();
hmizuno 1:d52c0ea6e922 375
hmizuno 1:d52c0ea6e922 376 //オーディオ回路スリープ
hmizuno 1:d52c0ea6e922 377 audioOff();
hmizuno 1:d52c0ea6e922 378
hmizuno 0:8e6f778abf78 379 }
hmizuno 0:8e6f778abf78 380
hmizuno 0:8e6f778abf78 381 /****************************************************************************/
hmizuno 0:8e6f778abf78 382
hmizuno 0:8e6f778abf78 383 /*************/
hmizuno 0:8e6f778abf78 384 /*** 制御系 ***/
hmizuno 0:8e6f778abf78 385 /*************/
hmizuno 0:8e6f778abf78 386
hmizuno 0:8e6f778abf78 387 //エンジン始動OKの処理
hmizuno 0:8e6f778abf78 388 void allowDrive(){
hmizuno 0:8e6f778abf78 389 //処理を変えたい場合書き換えてください
hmizuno 0:8e6f778abf78 390 relay = 1;
hmizuno 0:8e6f778abf78 391 myled1 = 1;
hmizuno 0:8e6f778abf78 392 myled2 = 0;
hmizuno 0:8e6f778abf78 393 myled3 = 0;
hmizuno 0:8e6f778abf78 394 myled4 = 1;
hmizuno 0:8e6f778abf78 395 }
hmizuno 0:8e6f778abf78 396
hmizuno 0:8e6f778abf78 397 //エンジン始動NGの処理
hmizuno 0:8e6f778abf78 398 void disallowDrive(){
hmizuno 0:8e6f778abf78 399 relay = 0;
hmizuno 0:8e6f778abf78 400 myled1 = 0;
hmizuno 0:8e6f778abf78 401 myled2 = 1;
hmizuno 0:8e6f778abf78 402 myled3 = 1;
hmizuno 0:8e6f778abf78 403 myled4 = 0;
hmizuno 0:8e6f778abf78 404 }
hmizuno 0:8e6f778abf78 405
hmizuno 1:d52c0ea6e922 406 void audioOn(){
hmizuno 1:d52c0ea6e922 407 //ATP3011 Highだと動作、NJM2113 LOWだと動作
hmizuno 1:d52c0ea6e922 408 afAmpSleep = 0;
hmizuno 1:d52c0ea6e922 409 nAtpSleep = 1;
hmizuno 1:d52c0ea6e922 410 }
hmizuno 1:d52c0ea6e922 411
hmizuno 1:d52c0ea6e922 412 void audioOff(){
hmizuno 1:d52c0ea6e922 413 afAmpSleep = 1;
hmizuno 1:d52c0ea6e922 414 nAtpSleep = 0;
hmizuno 1:d52c0ea6e922 415 }
hmizuno 1:d52c0ea6e922 416
hmizuno 0:8e6f778abf78 417 void reset(){
hmizuno 0:8e6f778abf78 418 rcs620.reset();
hmizuno 0:8e6f778abf78 419 }
hmizuno 0:8e6f778abf78 420
hmizuno 0:8e6f778abf78 421 //「免許証をタッチしてください」アナウンス
hmizuno 0:8e6f778abf78 422 void announcePleaseTouch(){
hmizuno 0:8e6f778abf78 423 //音声合成「免許証をタッチしてください」
hmizuno 0:8e6f778abf78 424 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 425 atp301x.talk("mennkyo'sho-o/ta'cchi/shitekudasa'i.\r\0",false);
hmizuno 0:8e6f778abf78 426 }
hmizuno 0:8e6f778abf78 427 if(!ig_start_sw.read()){
hmizuno 0:8e6f778abf78 428 beep.NshotOn(3, 0.07, 0.03);
hmizuno 0:8e6f778abf78 429 }
hmizuno 0:8e6f778abf78 430 }
hmizuno 0:8e6f778abf78 431
hmizuno 0:8e6f778abf78 432 //無免許警報ブザー処理
hmizuno 0:8e6f778abf78 433 void igswRiseIrq(){
hmizuno 0:8e6f778abf78 434 beep.turnOn();
hmizuno 0:8e6f778abf78 435 announcePleaseTouch();
hmizuno 0:8e6f778abf78 436 }
hmizuno 0:8e6f778abf78 437
hmizuno 0:8e6f778abf78 438 //USE_ATP301X 設定に応じビープモード切替
hmizuno 0:8e6f778abf78 439 //ATP3011をしゃべらせる場合はatp3011でwait()、しゃべらせない場合はbeepでwait()
hmizuno 0:8e6f778abf78 440 void errorBeep(int shotnum){
hmizuno 0:8e6f778abf78 441 if(USE_ATP301X){
hmizuno 0:8e6f778abf78 442 beep.NshotOn(shotnum, 0.2, 0.1);
hmizuno 0:8e6f778abf78 443 }else{
hmizuno 0:8e6f778abf78 444 beep.NshotOnwithWait(shotnum, 0.2, 0.1);
hmizuno 0:8e6f778abf78 445 }
hmizuno 0:8e6f778abf78 446 }
hmizuno 0:8e6f778abf78 447
hmizuno 0:8e6f778abf78 448 /*************/
hmizuno 0:8e6f778abf78 449 /*** 送信系 ***/
hmizuno 0:8e6f778abf78 450 /*************/
hmizuno 0:8e6f778abf78 451
hmizuno 0:8e6f778abf78 452 //AIDからSELECTコマンドを作成しIndataexchanfeへ投げる
hmizuno 0:8e6f778abf78 453 void sendSELECTbyAID(const uint8_t aid[], bool isGetFCI){
hmizuno 0:8e6f778abf78 454
hmizuno 0:8e6f778abf78 455 uint8_t *wireless_command;
hmizuno 0:8e6f778abf78 456
hmizuno 0:8e6f778abf78 457 if(isGetFCI){
hmizuno 0:8e6f778abf78 458 wireless_command = (uint8_t*)malloc(sizeof(uint8_t) * (21));
hmizuno 0:8e6f778abf78 459 }else{
hmizuno 0:8e6f778abf78 460 wireless_command = (uint8_t*)malloc(sizeof(uint8_t) * (22));
hmizuno 0:8e6f778abf78 461 }
hmizuno 0:8e6f778abf78 462
hmizuno 0:8e6f778abf78 463 //0x00,0xA4,0x04,0x0C,0x10,AID_16byte
hmizuno 0:8e6f778abf78 464 //0x00,0xA4,0x04,0x00,0x10,AID_16byte,0x00
hmizuno 0:8e6f778abf78 465
hmizuno 0:8e6f778abf78 466 wireless_command[0] = 0x00;
hmizuno 0:8e6f778abf78 467 wireless_command[1] = 0xA4;
hmizuno 0:8e6f778abf78 468 wireless_command[2] = 0x04;
hmizuno 0:8e6f778abf78 469 if(isGetFCI){
hmizuno 0:8e6f778abf78 470 wireless_command[3] = 0x00;
hmizuno 0:8e6f778abf78 471 }else{
hmizuno 0:8e6f778abf78 472 wireless_command[3] = 0x0C;
hmizuno 0:8e6f778abf78 473 }
hmizuno 0:8e6f778abf78 474 wireless_command[4] = 0x10;
hmizuno 0:8e6f778abf78 475
hmizuno 0:8e6f778abf78 476 for(int i = 0; i < 16; i++){
hmizuno 0:8e6f778abf78 477 wireless_command[i + 5] = aid[i];
hmizuno 0:8e6f778abf78 478 }
hmizuno 0:8e6f778abf78 479
hmizuno 0:8e6f778abf78 480 if(isGetFCI){
hmizuno 0:8e6f778abf78 481 wireless_command[21] = 0x00;
hmizuno 0:8e6f778abf78 482 rcs620.sendInDataExchange_and_RecieveRes(wireless_command, 22);
hmizuno 0:8e6f778abf78 483 }else{
hmizuno 0:8e6f778abf78 484 rcs620.sendInDataExchange_and_RecieveRes(wireless_command, 21);
hmizuno 0:8e6f778abf78 485 }
hmizuno 0:8e6f778abf78 486
hmizuno 0:8e6f778abf78 487 free(wireless_command);
hmizuno 0:8e6f778abf78 488 }
hmizuno 0:8e6f778abf78 489
hmizuno 0:8e6f778abf78 490
hmizuno 0:8e6f778abf78 491 /*************/
hmizuno 0:8e6f778abf78 492 /*** 検査系 ***/
hmizuno 0:8e6f778abf78 493 /*************/
hmizuno 0:8e6f778abf78 494
hmizuno 0:8e6f778abf78 495 //ATQB応用データを免許証仕様書記載値と照合
hmizuno 0:8e6f778abf78 496 bool checkATQB(uint8_t cardRes[], int len){
hmizuno 0:8e6f778abf78 497 if(len < 14){
hmizuno 0:8e6f778abf78 498 return false;
hmizuno 0:8e6f778abf78 499 }
hmizuno 0:8e6f778abf78 500 //ATQB応用データが "00 00 00 00" であるか確認
hmizuno 0:8e6f778abf78 501 for(int j = 6; j<=9;j++){
hmizuno 0:8e6f778abf78 502 if(cardRes[j] != 0x00){
hmizuno 0:8e6f778abf78 503 return false;
hmizuno 0:8e6f778abf78 504 }
hmizuno 0:8e6f778abf78 505 }
hmizuno 0:8e6f778abf78 506 return true;
hmizuno 0:8e6f778abf78 507 }
hmizuno 0:8e6f778abf78 508
hmizuno 0:8e6f778abf78 509 //SELECTに対する応答をチェック
hmizuno 0:8e6f778abf78 510 bool checkSELECTres(uint8_t cardRes[], int len){
hmizuno 0:8e6f778abf78 511 if(len < 2){
hmizuno 0:8e6f778abf78 512 return false;
hmizuno 0:8e6f778abf78 513 }
hmizuno 0:8e6f778abf78 514 //カードのレスポンスが”90 00"(正常終了)または"62 83"(暗証番号間違えすぎてロック)であればフォルダが存在と判断
hmizuno 0:8e6f778abf78 515 if(cardRes[0] == 0x90 && cardRes[1] == 0x00){
hmizuno 0:8e6f778abf78 516 if(SHOW_DEBUG){pc.printf("Card Status OK! %02X %02X\r\n",cardRes[0],cardRes[1]);}
hmizuno 0:8e6f778abf78 517 return true;
hmizuno 0:8e6f778abf78 518 }else if(cardRes[0] == 0x62 && cardRes[1] == 0x83){
hmizuno 0:8e6f778abf78 519 if(SHOW_DEBUG){pc.printf("Card Status LOCKED but OK! %02X %02X\r\n",cardRes[0],cardRes[1]);}
hmizuno 0:8e6f778abf78 520 return true;
hmizuno 0:8e6f778abf78 521 }else{
hmizuno 0:8e6f778abf78 522 if(SHOW_DEBUG){pc.printf("Card Status ERROR! %02X %02X\r\n",cardRes[0],cardRes[1]);}
hmizuno 0:8e6f778abf78 523 return false;
hmizuno 0:8e6f778abf78 524 }
hmizuno 0:8e6f778abf78 525 }
hmizuno 0:8e6f778abf78 526
hmizuno 0:8e6f778abf78 527 //READ_BINARYに対する応答をチェック
hmizuno 0:8e6f778abf78 528 bool checkREAD_BINARYres(uint8_t cardRes[], int len){
hmizuno 0:8e6f778abf78 529 if(len < 2){
hmizuno 0:8e6f778abf78 530 return false;
hmizuno 0:8e6f778abf78 531 }
hmizuno 0:8e6f778abf78 532
hmizuno 0:8e6f778abf78 533 //カードのレスポンスが”90 00"(正常終了)であるかチェック
hmizuno 0:8e6f778abf78 534 if(cardRes[len-2] == 0x90 && cardRes[len-1] == 0x00){
hmizuno 0:8e6f778abf78 535 if(SHOW_DEBUG){pc.printf("Card Status OK! %02X %02X\r\n",cardRes[len-2],cardRes[len-1]);}
hmizuno 0:8e6f778abf78 536 return true;
hmizuno 0:8e6f778abf78 537 }else{
hmizuno 0:8e6f778abf78 538 if(SHOW_DEBUG){pc.printf("Card Status ERROR! %02X %02X\r\n",cardRes[len-2],cardRes[len-1]);}
hmizuno 0:8e6f778abf78 539 return false;
hmizuno 0:8e6f778abf78 540 }
hmizuno 0:8e6f778abf78 541 }
hmizuno 0:8e6f778abf78 542
hmizuno 0:8e6f778abf78 543 //免許証有効期限チェック
hmizuno 0:8e6f778abf78 544 bool isEfectiveLicenseCard(tm yukoKigen){
hmizuno 0:8e6f778abf78 545 //unix時刻で比較する
hmizuno 0:8e6f778abf78 546
hmizuno 0:8e6f778abf78 547 time_t currentUnixTime;
hmizuno 0:8e6f778abf78 548 currentUnixTime = time(NULL); //read RTC as UNIX time data
hmizuno 0:8e6f778abf78 549
hmizuno 0:8e6f778abf78 550 //有効期限を当日指定のunix秒に変換
hmizuno 0:8e6f778abf78 551 struct tm yuko_t;
hmizuno 0:8e6f778abf78 552 time_t yuko_unixTime;
hmizuno 0:8e6f778abf78 553
hmizuno 0:8e6f778abf78 554 yuko_t.tm_sec = 00; // 0-59
hmizuno 0:8e6f778abf78 555 yuko_t.tm_min = 00; // 0-59
hmizuno 0:8e6f778abf78 556 yuko_t.tm_hour = KIGENGIRETOSURUJIKOKU_H; // 0-23
hmizuno 0:8e6f778abf78 557 yuko_t.tm_mday = yukoKigen.tm_mday; // 1-31
hmizuno 0:8e6f778abf78 558 yuko_t.tm_mon = yukoKigen.tm_mon; // 0-11
hmizuno 0:8e6f778abf78 559 yuko_t.tm_year = yukoKigen.tm_year; // 1900年からの経過年
hmizuno 0:8e6f778abf78 560 yuko_unixTime = mktime(&yuko_t);
hmizuno 0:8e6f778abf78 561
hmizuno 0:8e6f778abf78 562
hmizuno 0:8e6f778abf78 563 if(SHOW_DEBUG){
hmizuno 0:8e6f778abf78 564 //★重要★現在時刻はポインター変数!!!!!
hmizuno 0:8e6f778abf78 565
hmizuno 0:8e6f778abf78 566 char buffer[32];
hmizuno 0:8e6f778abf78 567 strftime(buffer, 32, "%F %T\n", localtime(&currentUnixTime));
hmizuno 0:8e6f778abf78 568 pc.printf("CurrentTime = %s\r\n", buffer);
hmizuno 0:8e6f778abf78 569
hmizuno 0:8e6f778abf78 570 strftime(buffer, 32, "%F %T\n", localtime(&yuko_unixTime));
hmizuno 0:8e6f778abf78 571 pc.printf("Yuko-Kigen = %s\r\n", buffer);
hmizuno 0:8e6f778abf78 572 }
hmizuno 0:8e6f778abf78 573
hmizuno 0:8e6f778abf78 574 if(currentUnixTime < yuko_unixTime){
hmizuno 0:8e6f778abf78 575 if(SHOW_DEBUG){
hmizuno 0:8e6f778abf78 576 pc.printf("You can drive!\r\n");
hmizuno 0:8e6f778abf78 577 }
hmizuno 0:8e6f778abf78 578 return true;
hmizuno 0:8e6f778abf78 579 }else{
hmizuno 0:8e6f778abf78 580 if(SHOW_DEBUG){
hmizuno 0:8e6f778abf78 581 pc.printf("You cannot drive!\r\n");
hmizuno 0:8e6f778abf78 582 }
hmizuno 0:8e6f778abf78 583 return false;
hmizuno 0:8e6f778abf78 584 }
hmizuno 0:8e6f778abf78 585 }
hmizuno 0:8e6f778abf78 586
hmizuno 0:8e6f778abf78 587
hmizuno 0:8e6f778abf78 588 /*************/
hmizuno 0:8e6f778abf78 589 /*** 時間系 ***/
hmizuno 0:8e6f778abf78 590 /*************/
hmizuno 0:8e6f778abf78 591
hmizuno 0:8e6f778abf78 592 //免許証の日付は、上位ビット・下位ビットで2桁を表す「パック2進化10進数」形式なのでintへ変換
hmizuno 0:8e6f778abf78 593 int packedBCDtoInt(uint8_t input){
hmizuno 0:8e6f778abf78 594 uint8_t ten,one;
hmizuno 0:8e6f778abf78 595 int out = 0;
hmizuno 0:8e6f778abf78 596
hmizuno 0:8e6f778abf78 597 ten = (input >> 4) & 0x0F;
hmizuno 0:8e6f778abf78 598 one = input & 0x0F;
hmizuno 0:8e6f778abf78 599 out = 10 * (int)ten + (int)one;
hmizuno 0:8e6f778abf78 600
hmizuno 0:8e6f778abf78 601 return out;
hmizuno 0:8e6f778abf78 602 }
hmizuno 0:8e6f778abf78 603
hmizuno 0:8e6f778abf78 604 //免許書のパック2進化10進数形式の日付データをtm構造体へ変換
hmizuno 0:8e6f778abf78 605 tm packedBCDdata_to_tmStruct(uint8_t yyyymmdd[]){
hmizuno 0:8e6f778abf78 606 int year;
hmizuno 0:8e6f778abf78 607 int month;
hmizuno 0:8e6f778abf78 608 int day;
hmizuno 0:8e6f778abf78 609 tm out_tm;
hmizuno 0:8e6f778abf78 610
hmizuno 0:8e6f778abf78 611 year = 100 * packedBCDtoInt(yyyymmdd[0]) + packedBCDtoInt(yyyymmdd[1]);
hmizuno 0:8e6f778abf78 612 month = packedBCDtoInt(yyyymmdd[2]);
hmizuno 0:8e6f778abf78 613 day = packedBCDtoInt(yyyymmdd[3]);
hmizuno 0:8e6f778abf78 614
hmizuno 0:8e6f778abf78 615 out_tm.tm_year = year - 1900; //1900年からの経過年
hmizuno 0:8e6f778abf78 616 out_tm.tm_mon = month - 1; //1月からの月数 (0 ~ 11)
hmizuno 0:8e6f778abf78 617 out_tm.tm_mday = day;
hmizuno 0:8e6f778abf78 618
hmizuno 0:8e6f778abf78 619 return out_tm;
hmizuno 0:8e6f778abf78 620 }
hmizuno 0:8e6f778abf78 621
hmizuno 0:8e6f778abf78 622 //共通データ要素の中身を整理して構造体へ保存
hmizuno 0:8e6f778abf78 623 mfDataStruct mfData_toStruct(uint8_t cardRes[], int len){
hmizuno 0:8e6f778abf78 624 mfDataStruct mf_Data;
hmizuno 0:8e6f778abf78 625 for(int i = 0; i < sizeof(mf_Data.shiyoVer);i++){
hmizuno 0:8e6f778abf78 626 mf_Data.shiyoVer[i] = cardRes[i + 2];
hmizuno 0:8e6f778abf78 627 }
hmizuno 0:8e6f778abf78 628 for(int i = 0; i < sizeof(mf_Data.kofuYYYYMMDD);i++){
hmizuno 0:8e6f778abf78 629 mf_Data.kofuYYYYMMDD[i] = cardRes[i + 5];
hmizuno 0:8e6f778abf78 630 }
hmizuno 0:8e6f778abf78 631 for(int i = 0; i < sizeof(mf_Data.yukoYYYYMMDD);i++){
hmizuno 0:8e6f778abf78 632 mf_Data.yukoYYYYMMDD[i] = cardRes[i + 9];
hmizuno 0:8e6f778abf78 633 }
hmizuno 0:8e6f778abf78 634 return mf_Data;
hmizuno 0:8e6f778abf78 635 }
hmizuno 0:8e6f778abf78 636
hmizuno 0:8e6f778abf78 637 //RTCが設定されているか確認
hmizuno 0:8e6f778abf78 638 bool isSetRTC(){
hmizuno 0:8e6f778abf78 639 time_t currentUnixTime;
hmizuno 0:8e6f778abf78 640 currentUnixTime = time(NULL); //unix時刻でRTCを取得
hmizuno 0:8e6f778abf78 641 if(localtime(&currentUnixTime)->tm_year == 70){ //1970年だったら未設定
hmizuno 0:8e6f778abf78 642 return false;
hmizuno 0:8e6f778abf78 643 }else{
hmizuno 0:8e6f778abf78 644 return true;
hmizuno 0:8e6f778abf78 645 }
hmizuno 0:8e6f778abf78 646 }
hmizuno 0:8e6f778abf78 647
hmizuno 0:8e6f778abf78 648 //RTCにダミー時刻を設定(コンパイルする都度手動書き換え)
hmizuno 0:8e6f778abf78 649 void setDummyRTC(){
hmizuno 0:8e6f778abf78 650 //時計確認
hmizuno 0:8e6f778abf78 651 struct tm t;
hmizuno 0:8e6f778abf78 652 time_t seconds;
hmizuno 0:8e6f778abf78 653 //時刻設定
hmizuno 0:8e6f778abf78 654
hmizuno 0:8e6f778abf78 655 t.tm_sec = 0; // 0-59
hmizuno 0:8e6f778abf78 656 t.tm_min = 0; // 0-59
hmizuno 0:8e6f778abf78 657 t.tm_hour = 12; // 0-23
hmizuno 0:8e6f778abf78 658 t.tm_mday = 29; // 1-31
hmizuno 0:8e6f778abf78 659 t.tm_mon = 4; // 0-11
hmizuno 0:8e6f778abf78 660 t.tm_year = 120; // 1900年からの経過年
hmizuno 0:8e6f778abf78 661 seconds = mktime(&t);
hmizuno 0:8e6f778abf78 662 set_time(seconds);
hmizuno 0:8e6f778abf78 663
hmizuno 0:8e6f778abf78 664 seconds = time(NULL);
hmizuno 0:8e6f778abf78 665 char buffer[32];
hmizuno 0:8e6f778abf78 666 strftime(buffer, 32, "%F:%I:%M %p\n", localtime(&seconds));
hmizuno 0:8e6f778abf78 667 pc.printf("Current Time Setting = %s\r\n", buffer);
hmizuno 0:8e6f778abf78 668 }
hmizuno 0:8e6f778abf78 669
hmizuno 0:8e6f778abf78 670 //TeraTermからRTC時刻設定
hmizuno 0:8e6f778abf78 671 void setRTCfromUSBPC(){
hmizuno 0:8e6f778abf78 672
hmizuno 0:8e6f778abf78 673 pc.printf("Pleaase make sure that the backup-battery is connected to the VB terminal.\r\n");
hmizuno 0:8e6f778abf78 674
hmizuno 0:8e6f778abf78 675 struct tm t;
hmizuno 0:8e6f778abf78 676 time_t seconds;
hmizuno 0:8e6f778abf78 677 //時刻設定
hmizuno 0:8e6f778abf78 678
hmizuno 0:8e6f778abf78 679 t.tm_sec = 0; // 0-59
hmizuno 0:8e6f778abf78 680 seconds = mktime(&t);
hmizuno 0:8e6f778abf78 681 set_time(seconds);
hmizuno 0:8e6f778abf78 682
hmizuno 0:8e6f778abf78 683
hmizuno 0:8e6f778abf78 684 int input = 0;
hmizuno 0:8e6f778abf78 685 pc.printf("Please input Year(YYYY), and push Enter-key.\r\n");
hmizuno 0:8e6f778abf78 686 scanf("%d",&input);
hmizuno 0:8e6f778abf78 687 t.tm_year = input - 1900;
hmizuno 0:8e6f778abf78 688 input = 0;
hmizuno 0:8e6f778abf78 689 pc.printf("Please input Month(1-12), and push Enter-key.\r\n");
hmizuno 0:8e6f778abf78 690 scanf("%d",&input);
hmizuno 0:8e6f778abf78 691 t.tm_mon = input - 1; // 0-11
hmizuno 0:8e6f778abf78 692 input = 0;
hmizuno 0:8e6f778abf78 693 pc.printf("Please input Day(1-31), and push Enter-key.\r\n");
hmizuno 0:8e6f778abf78 694 scanf("%d",&input);
hmizuno 0:8e6f778abf78 695 t.tm_mday = input; // 1-31
hmizuno 0:8e6f778abf78 696 input = 0;
hmizuno 0:8e6f778abf78 697 pc.printf("Please input Hour(0-23), and push Enter-key.\r\n");
hmizuno 0:8e6f778abf78 698 scanf("%d",&input);
hmizuno 0:8e6f778abf78 699 t.tm_hour = input; // 0-23
hmizuno 0:8e6f778abf78 700 input = 0;
hmizuno 0:8e6f778abf78 701 pc.printf("Please input Minute(0-59), and push Enter-key at 00 sec.\r\n");
hmizuno 0:8e6f778abf78 702 scanf("%d",&input); // 0-59
hmizuno 0:8e6f778abf78 703 t.tm_min = input;
hmizuno 0:8e6f778abf78 704
hmizuno 0:8e6f778abf78 705 t.tm_sec = 0; // 0-59
hmizuno 0:8e6f778abf78 706 seconds = mktime(&t);
hmizuno 0:8e6f778abf78 707 set_time(seconds);
hmizuno 0:8e6f778abf78 708
hmizuno 0:8e6f778abf78 709 seconds = time(NULL);
hmizuno 0:8e6f778abf78 710 char buffer[32];
hmizuno 0:8e6f778abf78 711 strftime(buffer, 32, "%F:%I:%M %p\n", localtime(&seconds));
hmizuno 0:8e6f778abf78 712 pc.printf("Current Time Setting = %s\r\n", buffer);
hmizuno 0:8e6f778abf78 713 }
hmizuno 0:8e6f778abf78 714
hmizuno 0:8e6f778abf78 715 /***************/
hmizuno 0:8e6f778abf78 716 /*** 表示機能 ***/
hmizuno 0:8e6f778abf78 717 /***************/
hmizuno 0:8e6f778abf78 718
hmizuno 0:8e6f778abf78 719 //レスポンスデータを全て表示
hmizuno 0:8e6f778abf78 720 void debugPrintAllRxData(){
hmizuno 0:8e6f778abf78 721 if(SHOW_DEBUG){
hmizuno 0:8e6f778abf78 722 uint8_t res[rcs620.RETURN_ENVELOPE_SIZE];
hmizuno 0:8e6f778abf78 723 int len;
hmizuno 0:8e6f778abf78 724 rcs620.getAllRes(res, &len);
hmizuno 0:8e6f778abf78 725
hmizuno 0:8e6f778abf78 726 //レスポンスデータの読み出し
hmizuno 0:8e6f778abf78 727 pc.printf("\r\nRC-S620 ACK ([ArrayIndex] HEX_DATA)\r\n");
hmizuno 0:8e6f778abf78 728 for(int i = 0; i <= 5 ; i++){
hmizuno 0:8e6f778abf78 729 pc.printf(" [%3d] %02X\r\n",i,res[i]);
hmizuno 0:8e6f778abf78 730 }
hmizuno 0:8e6f778abf78 731 pc.printf("\r\nRC-S620 Response ([ArrayIndex] HEX_DATA) \r\n");
hmizuno 0:8e6f778abf78 732 for(int i = 6; i < len ; i++){
hmizuno 0:8e6f778abf78 733 pc.printf(" [%3d] %02X\r\n",i,res[i]);
hmizuno 0:8e6f778abf78 734 }
hmizuno 0:8e6f778abf78 735 pc.printf("\r\n");
hmizuno 0:8e6f778abf78 736 }
hmizuno 0:8e6f778abf78 737 }
hmizuno 0:8e6f778abf78 738
hmizuno 0:8e6f778abf78 739 //ATQBレスポンスを整理して表示
hmizuno 0:8e6f778abf78 740 void debugPrintATQB(uint8_t cardRes[]){
hmizuno 0:8e6f778abf78 741 if(SHOW_DEBUG){
hmizuno 0:8e6f778abf78 742 pc.printf("--- TypeB_inListPassiveTarget_Res ---\r\n");
hmizuno 0:8e6f778abf78 743 pc.printf(" Tg = %02X\r\n",cardRes[0]);
hmizuno 0:8e6f778abf78 744 pc.printf(" ---------------ATQB----------------\r\n");
hmizuno 0:8e6f778abf78 745 pc.printf(" FirstByte = %02X\r\n",cardRes[1]);
hmizuno 0:8e6f778abf78 746 pc.printf(" PUPI = ");
hmizuno 0:8e6f778abf78 747 for(int j = 2; j<=5;j++){
hmizuno 0:8e6f778abf78 748 pc.printf("%02X ",cardRes[j]);
hmizuno 0:8e6f778abf78 749 }
hmizuno 0:8e6f778abf78 750 pc.printf("\r\n");
hmizuno 0:8e6f778abf78 751 pc.printf(" AppData = ");
hmizuno 0:8e6f778abf78 752 for(int j = 6; j<=9;j++){
hmizuno 0:8e6f778abf78 753 pc.printf("%02X ",cardRes[j]);
hmizuno 0:8e6f778abf78 754 }
hmizuno 0:8e6f778abf78 755 pc.printf("\r\n");
hmizuno 0:8e6f778abf78 756 pc.printf(" ProtocolInfo = ");
hmizuno 0:8e6f778abf78 757 for(int j = 10; j<=12;j++){
hmizuno 0:8e6f778abf78 758 pc.printf("%02X ",cardRes[j]);
hmizuno 0:8e6f778abf78 759 }
hmizuno 0:8e6f778abf78 760 pc.printf("\r\n");
hmizuno 0:8e6f778abf78 761 pc.printf(" ------------END of ATQB------------\r\n");
hmizuno 0:8e6f778abf78 762 pc.printf(" ATTRIB_LEN = %02X\r\n",cardRes[13]);
hmizuno 0:8e6f778abf78 763 pc.printf(" ATTRIB_RES = ");
hmizuno 0:8e6f778abf78 764 for(int j = 14; j<14+(int)cardRes[13];j++){
hmizuno 0:8e6f778abf78 765 pc.printf("%02X ",cardRes[j]);
hmizuno 0:8e6f778abf78 766 }
hmizuno 0:8e6f778abf78 767 pc.printf("\r\n");
hmizuno 0:8e6f778abf78 768 pc.printf("------------END of RES------------\r\n");
hmizuno 0:8e6f778abf78 769 }
hmizuno 0:8e6f778abf78 770 }
hmizuno 0:8e6f778abf78 771
hmizuno 0:8e6f778abf78 772 //共通データ要素を整理して表示
hmizuno 0:8e6f778abf78 773 void debugPrintMFdata(uint8_t cardRes[]){
hmizuno 0:8e6f778abf78 774 if(SHOW_DEBUG){
hmizuno 0:8e6f778abf78 775 pc.printf("\r\n---------------------MF DATA--------------------\r\n");
hmizuno 0:8e6f778abf78 776 pc.printf("\r\n------------Card Hakko-sha Data------------\r\n");
hmizuno 0:8e6f778abf78 777 pc.printf(" Tag\r\n %02X\r\n",cardRes[0]);
hmizuno 0:8e6f778abf78 778 pc.printf(" LEN\r\n %02X\r\n",cardRes[1]);
hmizuno 0:8e6f778abf78 779 pc.printf(" Shiyo-sho Ver\r\n ");
hmizuno 0:8e6f778abf78 780 for(int i = 2; i <= 4 ;i++){
hmizuno 0:8e6f778abf78 781 pc.printf("%02X ",cardRes[i]);
hmizuno 0:8e6f778abf78 782 }
hmizuno 0:8e6f778abf78 783 pc.printf("\r\n Ko-hunengappi\r\n ");
hmizuno 0:8e6f778abf78 784 for(int i = 5; i <= 8; i++){
hmizuno 0:8e6f778abf78 785 pc.printf("%02X ",cardRes[i]);
hmizuno 0:8e6f778abf78 786 }
hmizuno 0:8e6f778abf78 787 pc.printf("\r\n Yu-ko-kigen\r\n ");
hmizuno 0:8e6f778abf78 788 for(int i = 9; i < 12; i++){
hmizuno 0:8e6f778abf78 789 pc.printf("%02X ",cardRes[i]);
hmizuno 0:8e6f778abf78 790 }
hmizuno 0:8e6f778abf78 791 pc.printf("\r\n");
hmizuno 0:8e6f778abf78 792 pc.printf("\r\n------------Card Hakko-mae Data------------\r\n");
hmizuno 0:8e6f778abf78 793 pc.printf(" Tag\r\n %02X\r\n",cardRes[13]);
hmizuno 0:8e6f778abf78 794 pc.printf(" LEN\r\n %02X\r\n",cardRes[14]);
hmizuno 0:8e6f778abf78 795 pc.printf(" Seizo-gyo-sha shikibetsushi\r\n %02X\r\n",cardRes[15]);
hmizuno 0:8e6f778abf78 796 pc.printf(" Ango-kansu- shikibetsushi\r\n %02X\r\n",cardRes[16]);
hmizuno 0:8e6f778abf78 797 pc.printf("-----------------End of MF DATA-----------------\r\n\n");
hmizuno 0:8e6f778abf78 798 }
hmizuno 0:8e6f778abf78 799 }