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

Dependencies:   mbed ATP301x_SPI PwmBeep RCS620_AB

Committer:
hmizuno
Date:
Fri May 29 09:24:11 2020 +0000
Revision:
0:8e6f778abf78
Child:
1:d52c0ea6e922
Ver_0_0_9

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