00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #if !defined(_FEDM_NO_TAG_HANDLER_ISO15693)
00036
00037 #include "FedmIscTagHandler_ISO15693.h"
00038 #include "../FEDM_ISCReader.h"
00039 #include "../FEDM_ISOTabItem.h"
00040 #include "../FEDM_ISCReaderID.h"
00041 #include "../FEDM_ISC.h"
00042 #include "../../FEDM_Functions.h"
00043
00044
00045 #if _MSC_VER >= 1400
00046 #pragma warning(disable : 4996)
00047 #endif
00048
00049
00050
00051
00052
00053
00054
00055
00056 FedmIscTagHandler_ISO15693::FedmIscTagHandler_ISO15693(
00057 FEDM_ISCReader* pReader,
00058 FEDM_ISOTabItem* pTabItem )
00059 : FedmIscTagHandler(pReader, FedmIscTagHandler::TYPE_ISO15693, pTabItem)
00060 {
00061 m_sTagName = "ISO 15693";
00062
00063 Init();
00064 }
00065
00066 FedmIscTagHandler_ISO15693::FedmIscTagHandler_ISO15693(
00067 FEDM_ISCReader* pReader,
00068 unsigned int uiTagHandlerType,
00069 FEDM_ISOTabItem* pTabItem )
00070 : FedmIscTagHandler(pReader, uiTagHandlerType, pTabItem)
00071 {
00072 m_sTagName = "ISO 15693";
00073
00074 Init();
00075 }
00076
00077 FedmIscTagHandler_ISO15693::~FedmIscTagHandler_ISO15693()
00078 {
00079 }
00080
00081
00082 void FedmIscTagHandler_ISO15693::Init()
00083 {
00084 FedmIscTagHandler::Init();
00085 }
00086
00087
00088 const char* FedmIscTagHandler_ISO15693::GetManufacturerName()
00089 {
00090 return m_pTabItem->GetISO15693Manufacturer();
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 int FedmIscTagHandler_ISO15693::StayQuiet()
00107 {
00108 int iErr = 0;
00109
00110 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00111
00112 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00113 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00114
00115 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x02));
00116
00117 m_ucISOErrorCode = 0;
00118
00119
00120 int iBack = m_pReader->SendProtocol(0xB0);
00121 if(iBack == 0x95)
00122 {
00123 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00124 }
00125
00126 return iBack;
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 int FedmIscTagHandler_ISO15693::LockMultipleBlocks(
00146 unsigned int uiFirstDataBlock,
00147 unsigned int uiNoOfDataBlocks )
00148 {
00149 int iErr = 0;
00150
00151 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00152
00153 if(m_bNonAddressedMode)
00154 {
00155 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00156 }
00157 else
00158 {
00159 if(m_pTabItem->m_bIsSelected)
00160 {
00161 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00162 }
00163 else
00164 {
00165 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00166 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00167 }
00168 }
00169
00170 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR, uiFirstDataBlock));
00171 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00172
00173 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x22));
00174
00175 m_ucISOErrorCode = 0;
00176
00177
00178 int iBack = m_pReader->SendProtocol(0xB0);
00179 if(iBack == 0x95)
00180 {
00181 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00182 }
00183
00184 return iBack;
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 int FedmIscTagHandler_ISO15693::ResetToReady()
00202 {
00203 int iErr = 0;
00204
00205 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00206
00207 if(m_bNonAddressedMode)
00208 {
00209 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00210 }
00211 else
00212 {
00213 if(m_pTabItem->m_bIsSelected)
00214 {
00215 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00216 }
00217 else
00218 {
00219 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00220 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00221 }
00222 }
00223
00224 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x26));
00225
00226 m_ucISOErrorCode = 0;
00227
00228
00229 int iBack = m_pReader->SendProtocol(0xB0);
00230 if(iBack == 0x95)
00231 {
00232 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00233 }
00234
00235 return iBack;
00236 }
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252 int FedmIscTagHandler_ISO15693::WriteAFI(unsigned char ucAFI)
00253 {
00254 int iErr = 0;
00255
00256 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00257
00258 if(m_bNonAddressedMode)
00259 {
00260 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00261 }
00262 else
00263 {
00264 if(m_pTabItem->m_bIsSelected)
00265 {
00266 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00267 }
00268 else
00269 {
00270 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00271 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00272 }
00273 }
00274
00275 m_pTabItem->m_ucAFI = ucAFI;
00276
00277 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x27));
00278
00279 m_ucISOErrorCode = 0;
00280
00281
00282 int iBack = m_pReader->SendProtocol(0xB0);
00283 if(iBack == 0x95)
00284 {
00285 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00286 }
00287
00288 return iBack;
00289 }
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305 int FedmIscTagHandler_ISO15693::LockAFI()
00306 {
00307 int iErr = 0;
00308
00309 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00310
00311 if(m_bNonAddressedMode)
00312 {
00313 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00314 }
00315 else
00316 {
00317 if(m_pTabItem->m_bIsSelected)
00318 {
00319 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00320 }
00321 else
00322 {
00323 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00324 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00325 }
00326 }
00327
00328 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x28));
00329
00330 m_ucISOErrorCode = 0;
00331
00332
00333 int iBack = m_pReader->SendProtocol(0xB0);
00334 if(iBack == 0x95)
00335 {
00336 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00337 }
00338
00339 return iBack;
00340 }
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 int FedmIscTagHandler_ISO15693::WriteDSFID(unsigned char ucDSFID)
00357 {
00358 int iErr = 0;
00359
00360 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00361
00362 if(m_bNonAddressedMode)
00363 {
00364 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00365 }
00366 else
00367 {
00368 if(m_pTabItem->m_bIsSelected)
00369 {
00370 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00371 }
00372 else
00373 {
00374 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00375 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00376 }
00377 }
00378
00379 m_pTabItem->m_ucDsfID = ucDSFID;
00380
00381 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x29));
00382
00383 m_ucISOErrorCode = 0;
00384
00385
00386 int iBack = m_pReader->SendProtocol(0xB0);
00387 if(iBack == 0x95)
00388 {
00389 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00390 }
00391
00392 return iBack;
00393 }
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409 int FedmIscTagHandler_ISO15693::LockDSFID()
00410 {
00411 int iErr = 0;
00412
00413 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00414
00415 if(m_bNonAddressedMode)
00416 {
00417 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00418 }
00419 else
00420 {
00421 if(m_pTabItem->m_bIsSelected)
00422 {
00423 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00424 }
00425 else
00426 {
00427 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00428 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00429 }
00430 }
00431
00432 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x2A));
00433
00434 m_ucISOErrorCode = 0;
00435
00436
00437 int iBack = m_pReader->SendProtocol(0xB0);
00438 if(iBack == 0x95)
00439 {
00440 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00441 }
00442
00443 return iBack;
00444 }
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464 int FedmIscTagHandler_ISO15693::GetSystemInformation(
00465 string& sUid,
00466 unsigned char& ucAFI,
00467 unsigned int& uiMemSize,
00468 unsigned char& ucICRef )
00469 {
00470 int iErr = 0;
00471
00472 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00473
00474 if(m_bNonAddressedMode)
00475 {
00476 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00477 }
00478 else
00479 {
00480 if(m_pTabItem->m_bIsSelected)
00481 {
00482 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00483 }
00484 else
00485 {
00486 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00487 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00488 }
00489 }
00490
00491 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x2B));
00492
00493 m_ucISOErrorCode = 0;
00494
00495
00496 int iBack = m_pReader->SendProtocol(0xB0);
00497 if(iBack == 0)
00498 {
00499 FEDM_ConvHexUCharToHexStr(m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen, sUid);
00500 ucAFI = m_pTabItem->m_ucAFI;
00501 uiMemSize = (((unsigned int)m_pTabItem->m_ucMemSize[0]) << 8) + m_pTabItem->m_ucMemSize[1];
00502 ucICRef = m_pTabItem->m_ucICRef;
00503 }
00504 else if(iBack == 0x95)
00505 {
00506 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00507 }
00508
00509 return iBack;
00510 }
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529 int FedmIscTagHandler_ISO15693::GetMultipleBlockSecurityStatus(
00530 unsigned int uiFirstDataBlock,
00531 unsigned int uiNoOfDataBlocks,
00532 unsigned char* pucSecurityStatus )
00533 {
00534 int iErr = 0;
00535
00536 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00537
00538 if(m_bNonAddressedMode)
00539 {
00540 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00541 }
00542 else
00543 {
00544 if(m_pTabItem->m_bIsSelected)
00545 {
00546 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00547 }
00548 else
00549 {
00550 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00551 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00552 }
00553 }
00554
00555 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR, uiFirstDataBlock));
00556 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00557 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x2C));
00558
00559 m_ucISOErrorCode = 0;
00560
00561
00562 int iBack = m_pReader->SendProtocol(0xB0);
00563 if(iBack == 0)
00564 {
00565
00566 memcpy(pucSecurityStatus, &m_pTabItem->m_ucSecStatus[uiFirstDataBlock], uiNoOfDataBlocks);
00567 }
00568 else if(iBack == 0x95)
00569 {
00570 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00571 }
00572
00573 return iBack;
00574 }
00575
00576 #endif // #if !defined(_FEDM_NO_TAG_HANDLER_ISO15693)