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
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 #if !defined(_FEDM_NO_TAG_HANDLER_EPC_C1_G2)
00075
00076 #include "FedmIscTagHandler_EPC_Class1_Gen2.h"
00077 #include "../FEDM_ISCReader.h"
00078 #include "../FEDM_ISOTabItem.h"
00079 #include "../FEDM_ISCReaderID.h"
00080 #include "../FEDM_ISC.h"
00081 #include "../../FEDM_Functions.h"
00082
00083
00084 #if _MSC_VER >= 1400
00085 #pragma warning(disable : 4996)
00086 #endif
00087
00088
00089
00090 #if _MSC_VER <= 1200
00091 const unsigned int FedmIscTagHandler_EPC_Class1_Gen2::BANK_RESERVED = 0;
00092 const unsigned int FedmIscTagHandler_EPC_Class1_Gen2::BANK_EPC = 1;
00093 const unsigned int FedmIscTagHandler_EPC_Class1_Gen2::BANK_TID = 2;
00094 const unsigned int FedmIscTagHandler_EPC_Class1_Gen2::BANK_USER = 3;
00095
00096
00097 const unsigned char FedmIscTagHandler_EPC_Class1_Gen2::UNCHANGED = 0x00;
00098 const unsigned char FedmIscTagHandler_EPC_Class1_Gen2::UNLOCK = 0x20;
00099 const unsigned char FedmIscTagHandler_EPC_Class1_Gen2::UNLOCK_PERMANENTLY = 0x31;
00100 const unsigned char FedmIscTagHandler_EPC_Class1_Gen2::LOCK = 0x22;
00101 const unsigned char FedmIscTagHandler_EPC_Class1_Gen2::LOCK_PERMANENTLY = 0x33;
00102 #endif
00103
00104
00105
00106
00107
00108
00109 FedmIscTagHandler_EPC_Class1_Gen2::FedmIscTagHandler_EPC_Class1_Gen2(
00110 FEDM_ISCReader* pReader,
00111 FEDM_ISOTabItem* pTabItem )
00112 : FedmIscTagHandler(pReader, FedmIscTagHandler::TYPE_EPC_CLASS1_GEN2, pTabItem)
00113 {
00114 m_sTagName = "EPC_Class1_Gen2";
00115 }
00116
00117
00118 FedmIscTagHandler_EPC_Class1_Gen2::FedmIscTagHandler_EPC_Class1_Gen2(
00119 FEDM_ISCReader* pReader,
00120 unsigned int uiTagHandlerType,
00121 FEDM_ISOTabItem* pTabItem)
00122 : FedmIscTagHandler(pReader, uiTagHandlerType, pTabItem)
00123 {
00124 m_sTagName = "EPC_Class1_Gen2";
00125 }
00126
00127 FedmIscTagHandler_EPC_Class1_Gen2::~FedmIscTagHandler_EPC_Class1_Gen2()
00128 {
00129 }
00130
00131
00132
00133
00134
00135
00136 bool FedmIscTagHandler_EPC_Class1_Gen2::IsUidWithTid()
00137 {
00138 if(m_pTabItem->m_ucIDDT == 0x02)
00139 return true;
00140
00141 return false;
00142 }
00143
00144 bool FedmIscTagHandler_EPC_Class1_Gen2::IsExtendedPC_W1()
00145 {
00146 return m_pTabItem->IsExtendedPC_W1();
00147 }
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 unsigned int FedmIscTagHandler_EPC_Class1_Gen2::GetProtocolControl()
00161 {
00162 return (unsigned int)m_pTabItem->m_ucClass1Gen2_PC[0] + ((unsigned int)(m_pTabItem->m_ucClass1Gen2_PC[1]) << 8);
00163 }
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 unsigned int FedmIscTagHandler_EPC_Class1_Gen2::GetExtendedProtocolControlW1()
00177 {
00178 return (unsigned int)m_pTabItem->m_ucClass1Gen2_XPC_W1[0] + ((unsigned int)(m_pTabItem->m_ucClass1Gen2_XPC_W1[1]) << 8);
00179 }
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193 const char* FedmIscTagHandler_EPC_Class1_Gen2::GetEpcOfUid()
00194 {
00195 int iBack = FEDM_ConvHexUCharToHexStr(m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen, m_sUid);
00196 if(iBack)
00197 return "";
00198
00199 unsigned char ucEpcLen = ((m_pTabItem->m_ucClass1Gen2_PC[0] & 0xF8) >> 3) * 2;
00200 if(ucEpcLen == 0)
00201 return "";
00202
00203 m_sEpc = m_sUid.substr(0, ucEpcLen*2);
00204 return m_sEpc.c_str();
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 const char* FedmIscTagHandler_EPC_Class1_Gen2::GetTidOfUid()
00223 {
00224 int iBack = FEDM_ConvHexUCharToHexStr(m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen, m_sUid);
00225 if(iBack)
00226 return "";
00227
00228 unsigned char ucEpcLen = ((m_pTabItem->m_ucClass1Gen2_PC[0] & 0xF8) >> 3) * 2;
00229
00230 if( size_t(ucEpcLen*2) >= m_sUid.size() )
00231 return "";
00232
00233 m_sTid = m_sUid.substr(ucEpcLen*2, m_sUid.size() - ucEpcLen*2);
00234 return m_sTid.c_str();
00235 }
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 unsigned int FedmIscTagHandler_EPC_Class1_Gen2::GetTagModelNumber()
00250 {
00251 return m_pTabItem->GetEpcC1G2TagModelNumber();
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266 unsigned int FedmIscTagHandler_EPC_Class1_Gen2::GetMaskDesignerID()
00267 {
00268 return m_pTabItem->GetEpcC1G2MaskDesignerID();
00269 }
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283 const char* FedmIscTagHandler_EPC_Class1_Gen2::GetMaskDesignerName()
00284 {
00285 return m_pTabItem->GetEpcC1G2MaskDesignerName();
00286 }
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314 int FedmIscTagHandler_EPC_Class1_Gen2::ReadCompleteBank(
00315 unsigned int uiBank,
00316 std::string sPassword,
00317 unsigned char* pucData,
00318 unsigned int uiDataBufferSize,
00319 unsigned int& uiNoOfDataBlocksRead )
00320 {
00321 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "Bank=" << uiBank);
00322
00323 FEDM_CHK3(pucData);
00324
00325 int iErr = 0;
00326 unsigned int uiBlockAddress = 0;
00327 unsigned int uiNoOfDataBlocks = 0;
00328
00329 uiNoOfDataBlocksRead = 0;
00330
00331
00332 if(uiDataBufferSize == 0)
00333 {
00334 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - DataBufferSize is zero");
00335 return FEDM_ERROR_PARAMETER;
00336 }
00337
00338
00339 if(sPassword.length() > 0 && sPassword.length() % 2)
00340 {
00341 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
00342 return FEDM_ERROR_ODD_STRING_LENGTH;
00343 }
00344
00345
00346 switch(uiBank)
00347 {
00348 case FEDM_ISC_ISO_BANK_RESERVED:
00349 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00350 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00351 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00352 break;
00353 default:
00354 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid Bank Number");
00355 return FEDM_ERROR_PARAMETER;
00356 }
00357
00358
00359 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00360 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00361 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_READ_COMPLETE_BANK, true));
00362
00363 if(m_bNonAddressedMode)
00364 {
00365
00366 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00367 }
00368 else
00369 {
00370 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00371 if(m_pTabItem->m_ucSnrLen != 8)
00372 {
00373 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_UID_LF, true));
00374 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID_LEN, m_pTabItem->m_ucSnrLen));
00375 }
00376 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00377 }
00378
00379 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)0));
00380 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_BANK_NR, uiBank));
00381
00382 if(sPassword.length() > 0)
00383 {
00384 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_ACCESS_FLAG, true));
00385 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
00386 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW, sPassword));
00387 }
00388
00389 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, (unsigned int)0));
00390 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, (unsigned char)0));
00391
00392 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x23));
00393
00394
00395 int iBack = m_pReader->SendProtocol(0xB0);
00396 while( iBack == 0x00 ||
00397 iBack == 0x94)
00398 {
00399 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_RSP_DBN, &uiNoOfDataBlocks));
00400
00401 if( (uiNoOfDataBlocks * 2) > uiDataBufferSize)
00402 {
00403
00404 switch(uiBank)
00405 {
00406 case FEDM_ISC_ISO_BANK_RESERVED:
00407 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB_ResBank[uiBlockAddress*2], uiDataBufferSize);
00408 break;
00409 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00410 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB_EpcBank[uiBlockAddress*2], uiDataBufferSize);
00411 break;
00412 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00413 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB_TidBank[uiBlockAddress*2], uiDataBufferSize);
00414 break;
00415 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00416 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB[uiBlockAddress*2], uiDataBufferSize);
00417 break;
00418 }
00419
00420 uiNoOfDataBlocksRead = (uiDataBufferSize >> 1);
00421
00422
00423 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - DataBuffer is too small");
00424 return FEDM_ERROR_BUFFER_LENGTH;
00425 }
00426
00427
00428 switch(uiBank)
00429 {
00430 case FEDM_ISC_ISO_BANK_RESERVED:
00431 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB_ResBank[uiBlockAddress*2], uiNoOfDataBlocks * 2);
00432 break;
00433 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00434 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB_EpcBank[uiBlockAddress*2], uiNoOfDataBlocks * 2);
00435 break;
00436 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00437 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB_TidBank[uiBlockAddress*2], uiNoOfDataBlocks * 2);
00438 break;
00439 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00440 memcpy( (pucData + uiBlockAddress*2), &m_pTabItem->m_ucRxDB[uiBlockAddress*2], uiNoOfDataBlocks * 2);
00441 break;
00442 }
00443
00444 uiNoOfDataBlocksRead += uiNoOfDataBlocks;
00445 uiBlockAddress += uiNoOfDataBlocks;
00446
00447 if(iBack == 0)
00448 break;
00449
00450
00451
00452
00453 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiBlockAddress));
00454 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_MORE, true));
00455 iBack = m_pReader->SendProtocol(0xB0);
00456 }
00457
00458 if (iBack == 0x95)
00459 {
00460
00461 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00462 }
00463
00464 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, (unsigned int)0));
00465 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_MORE, false));
00466
00467 return iBack;
00468 }
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496 int FedmIscTagHandler_EPC_Class1_Gen2::ReadMultipleBlocks(
00497 unsigned int uiBank,
00498 unsigned int uiFirstDataBlock,
00499 unsigned int uiNoOfDataBlocks,
00500 string sPassword,
00501 unsigned char* pucData )
00502 {
00503 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "Bank=" << uiBank << ", FirstDataBlock=" << uiFirstDataBlock << ", NoOfDataBlocks" << uiNoOfDataBlocks);
00504
00505 FEDM_CHK3(pucData);
00506
00507 int iErr = 0;
00508
00509
00510 if(sPassword.length() > 0 && sPassword.length() % 2)
00511 {
00512 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
00513 return FEDM_ERROR_ODD_STRING_LENGTH;
00514 }
00515
00516
00517 switch(uiBank)
00518 {
00519 case FEDM_ISC_ISO_BANK_RESERVED:
00520 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucRxDB_ResBank.size() )
00521 {
00522 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > RxDB_ResBank.size()");
00523 return FEDM_ERROR_ARRAY_BOUNDARY;
00524 }
00525 break;
00526 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00527 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucRxDB_EpcBank.size() )
00528 {
00529 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > RxDB_EpcBank.size()");
00530 return FEDM_ERROR_ARRAY_BOUNDARY;
00531 }
00532 break;
00533 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00534 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucRxDB_TidBank.size() )
00535 {
00536 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > RxDB_TidBank.size()");
00537 return FEDM_ERROR_ARRAY_BOUNDARY;
00538 }
00539 break;
00540 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00541 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucRxDB.size() )
00542 {
00543 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > RxDB.size()");
00544 return FEDM_ERROR_ARRAY_BOUNDARY;
00545 }
00546 break;
00547 default:
00548 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid Bank Number");
00549 return FEDM_ERROR_PARAMETER;
00550 }
00551
00552
00553 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00554 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00555
00556 if(m_bNonAddressedMode)
00557 {
00558
00559 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00560 }
00561 else
00562 {
00563 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00564 if(m_pTabItem->m_ucSnrLen != 8)
00565 {
00566 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_UID_LF, true));
00567 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID_LEN, m_pTabItem->m_ucSnrLen));
00568 }
00569 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00570 }
00571
00572 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)0));
00573 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_BANK_NR, uiBank));
00574
00575 if(sPassword.length() > 0)
00576 {
00577 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_ACCESS_FLAG, true));
00578 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
00579 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW, sPassword));
00580 }
00581
00582 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiFirstDataBlock));
00583 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00584
00585 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x23));
00586
00587
00588 int iBack = m_pReader->SendProtocol(0xB0);
00589 if(iBack == 0)
00590 {
00591
00592 switch(uiBank)
00593 {
00594 case FEDM_ISC_ISO_BANK_RESERVED:
00595 memcpy(pucData, &m_pTabItem->m_ucRxDB_ResBank[uiFirstDataBlock*2], uiNoOfDataBlocks * 2);
00596 break;
00597 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00598 memcpy(pucData, &m_pTabItem->m_ucRxDB_EpcBank[uiFirstDataBlock*2], uiNoOfDataBlocks * 2);
00599 break;
00600 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00601 memcpy(pucData, &m_pTabItem->m_ucRxDB_TidBank[uiFirstDataBlock*2], uiNoOfDataBlocks * 2);
00602 break;
00603 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00604 memcpy(pucData, &m_pTabItem->m_ucRxDB[uiFirstDataBlock*2], uiNoOfDataBlocks * 2);
00605 break;
00606 }
00607 }
00608 else if (iBack == 0x95)
00609 {
00610
00611 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00612 }
00613
00614 return iBack;
00615 }
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640 int FedmIscTagHandler_EPC_Class1_Gen2::WriteMultipleBlocks(
00641 unsigned int uiBank,
00642 unsigned int uiFirstDataBlock,
00643 unsigned int uiNoOfDataBlocks,
00644 std::string sPassword,
00645 unsigned char* pucData )
00646 {
00647 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "Bank=" << uiBank << ", FirstDataBlock=" << uiFirstDataBlock << ", NoOfDataBlocks" << uiNoOfDataBlocks);
00648
00649 FEDM_CHK3(pucData);
00650
00651 int iErr = 0;
00652
00653
00654 if(sPassword.length() > 0 && sPassword.length() % 2)
00655 {
00656 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
00657 return FEDM_ERROR_ODD_STRING_LENGTH;
00658 }
00659
00660
00661 switch(uiBank)
00662 {
00663 case FEDM_ISC_ISO_BANK_RESERVED:
00664 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucTxDB_ResBank.size() )
00665 {
00666 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > TxDB_ResBank.size()");
00667 return FEDM_ERROR_ARRAY_BOUNDARY;
00668 }
00669 break;
00670 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00671 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucTxDB_EpcBank.size() )
00672 {
00673 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > TxDB_EpcBank.size()");
00674 return FEDM_ERROR_ARRAY_BOUNDARY;
00675 }
00676 break;
00677 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00678 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucTxDB_TidBank.size() )
00679 {
00680 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > TxDB_TidBank.size()");
00681 return FEDM_ERROR_ARRAY_BOUNDARY;
00682 }
00683 break;
00684 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00685 if( (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > m_pTabItem->m_ucTxDB.size() )
00686 {
00687 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * 2 > TxDB.size()");
00688 return FEDM_ERROR_ARRAY_BOUNDARY;
00689 }
00690 break;
00691 default:
00692 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid Bank Number");
00693 return FEDM_ERROR_PARAMETER;
00694 }
00695
00696
00697 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00698 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00699
00700 if(m_bNonAddressedMode)
00701 {
00702
00703 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00704 }
00705 else
00706 {
00707 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00708 if(m_pTabItem->m_ucSnrLen != 8)
00709 {
00710 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_UID_LF, true));
00711 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID_LEN, m_pTabItem->m_ucSnrLen));
00712 }
00713 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00714 }
00715
00716 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)0));
00717 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_BANK_NR, uiBank));
00718
00719 if(sPassword.length() > 0)
00720 {
00721 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_ACCESS_FLAG, true));
00722 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
00723 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW, sPassword));
00724 }
00725
00726 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiFirstDataBlock));
00727 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00728 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_SIZE, (unsigned char)2));
00729
00730 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x24));
00731
00732 m_pTabItem->m_ucBlockSize = (unsigned char)2;
00733
00734
00735 switch(uiBank)
00736 {
00737 case FEDM_ISC_ISO_BANK_RESERVED:
00738 memcpy(&m_pTabItem->m_ucTxDB_ResBank[uiFirstDataBlock*2], pucData, uiNoOfDataBlocks * 2);
00739 break;
00740 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
00741 memcpy(&m_pTabItem->m_ucTxDB_EpcBank[uiFirstDataBlock*2], pucData, uiNoOfDataBlocks * 2);
00742 break;
00743 case FEDM_ISC_ISO_BANK_TID_MEMORY:
00744 memcpy(&m_pTabItem->m_ucTxDB_TidBank[uiFirstDataBlock*2], pucData, uiNoOfDataBlocks * 2);
00745 break;
00746 case FEDM_ISC_ISO_BANK_USER_MEMORY:
00747 memcpy(&m_pTabItem->m_ucTxDB[uiFirstDataBlock*2], pucData, uiNoOfDataBlocks * 2);
00748 break;
00749 }
00750
00751
00752 int iBack = m_pReader->SendProtocol(0xB0);
00753 if(iBack == 0x03)
00754 {
00755
00756
00757 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_RSP_DB_EXT_ADR_E, &m_uiErrorDBAddress));
00758 }
00759 else if (iBack == 0x95)
00760 {
00761
00762 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00763 }
00764
00765 return iBack;
00766 }
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790 int FedmIscTagHandler_EPC_Class1_Gen2::WriteEPC(
00791 std::string sNewEPC,
00792 std::string sPassword )
00793 {
00794 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "NewEPC=" << sNewEPC);
00795
00796 int iErr = 0;
00797 unsigned char ucClass1Gen2PC[2] = {0, 0};
00798 unsigned char ucEPC[32];
00799
00800
00801 if(sNewEPC.length() % 4)
00802 {
00803 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of new EPC (=" << sNewEPC.length() << ")");
00804 return FEDM_ERROR_UNVALID_IDD_LENGTH;
00805 }
00806
00807
00808 if(sPassword.length() > 0 && sPassword.length() % 2)
00809 {
00810 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
00811 return FEDM_ERROR_ODD_STRING_LENGTH;
00812 }
00813
00814 memset(ucEPC, 0, 32);
00815
00816 iErr = FEDM_ConvHexStrToHexUChar(sNewEPC, ucEPC, 32);
00817 if(iErr < 0)
00818 {
00819 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Conversion error with EPC (=" << sNewEPC << ")");
00820 return iErr;
00821 }
00822
00823
00824 ucClass1Gen2PC[0] |= (((sNewEPC.length()/4)&0x1F) << 3);
00825
00826
00827
00828 m_pTabItem->m_ucTxDB_EpcBank[2] = ucClass1Gen2PC[1];
00829 m_pTabItem->m_ucTxDB_EpcBank[3] = ucClass1Gen2PC[0];
00830 for(int iCnt=0; iCnt<(int)sNewEPC.length()/2; iCnt+=2)
00831 {
00832 m_pTabItem->m_ucTxDB_EpcBank[4+iCnt] = ucEPC[iCnt+1];
00833 m_pTabItem->m_ucTxDB_EpcBank[4+iCnt+1] = ucEPC[iCnt];
00834 }
00835
00836
00837
00838 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00839 if(m_bNonAddressedMode)
00840 {
00841
00842 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00843 }
00844 else
00845 {
00846 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00847 if(m_pTabItem->m_ucSnrLen != 8)
00848 {
00849 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_UID_LF, true));
00850 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID_LEN, m_pTabItem->m_ucSnrLen));
00851 }
00852 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00853 }
00854 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00855
00856 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)0));
00857 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_BANK_NR, (unsigned char)FEDM_ISC_ISO_BANK_EPC_MEMORY));
00858
00859 if(sPassword.length() > 0)
00860 {
00861 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_ACCESS_FLAG, true));
00862 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
00863 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_ACCESS_PW, sPassword));
00864 }
00865
00866 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, (unsigned int)1));
00867 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, (unsigned char)(sNewEPC.length()/4 + 1)));
00868 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_SIZE, (unsigned char)2));
00869 m_pTabItem->m_ucBlockSize = 2;
00870 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x24));
00871
00872 int iBack = m_pReader->SendProtocol(0xB0);
00873 if (iBack == 0x95)
00874 {
00875
00876 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00877 }
00878
00879 return iBack;
00880 }
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907 int FedmIscTagHandler_EPC_Class1_Gen2::Kill(
00908 std::string sPassword,
00909 bool bRecom_AssertedLSB,
00910 bool bRecom_Asserted2SB,
00911 bool bRecom_Asserted3SB )
00912 {
00913 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__);
00914
00915 int iErr = 0;
00916 unsigned char ucRecomBits = 0;
00917
00918
00919 if(sPassword.length() > 0 && sPassword.length() % 2)
00920 {
00921 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
00922 return FEDM_ERROR_ODD_STRING_LENGTH;
00923 }
00924
00925
00926 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE, (unsigned char)0));
00927
00928 if(m_bNonAddressedMode)
00929 {
00930
00931 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00932 }
00933 else
00934 {
00935 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00936 if(m_pTabItem->m_ucSnrLen != 8)
00937 {
00938 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_EPC_LF, true));
00939 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC_LEN, m_pTabItem->m_ucSnrLen));
00940 }
00941 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00942 }
00943
00944 if(sPassword.length() > 0)
00945 {
00946 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_KILL_PW, sPassword));
00947 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_KILL_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
00948 }
00949 else
00950 {
00951 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_KILL_PW_LENGTH, (unsigned char)0));
00952 }
00953
00954 if(bRecom_AssertedLSB || bRecom_Asserted2SB || bRecom_Asserted3SB)
00955 {
00956 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_RECOM, true));
00957 if(bRecom_AssertedLSB)
00958 ucRecomBits |= 0x01;
00959 if(bRecom_Asserted2SB)
00960 ucRecomBits |= 0x02;
00961 if(bRecom_Asserted3SB)
00962 ucRecomBits |= 0x04;
00963
00964 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_RECOM_BITS, ucRecomBits));
00965 }
00966 else
00967 {
00968 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_RECOM_BITS, (unsigned char)0));
00969 }
00970
00971 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_CMD, (unsigned char)0x18));
00972
00973
00974 int iBack = m_pReader->SendProtocol(0xB3);
00975 if (iBack == 0x95)
00976 {
00977
00978 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
00979 }
00980
00981 return iBack;
00982 }
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001 int FedmIscTagHandler_EPC_Class1_Gen2::Lock(
01002 std::string sPassword,
01003 unsigned char ucLockKill,
01004 unsigned char ucLockAccess,
01005 unsigned char ucLockEPC,
01006 unsigned char ucLockTID,
01007 unsigned char ucLockUser)
01008 {
01009 return Lock(sPassword,
01010 (unsigned char)((ucLockKill & 0x30) >> 4),
01011 (unsigned char)(ucLockKill & 0x03),
01012 (unsigned char)((ucLockAccess & 0x30) >> 4),
01013 (unsigned char)(ucLockAccess & 0x03),
01014 (unsigned char)((ucLockEPC & 0x30) >> 4),
01015 (unsigned char)(ucLockEPC & 0x03),
01016 (unsigned char)((ucLockTID & 0x30) >> 4),
01017 (unsigned char)(ucLockTID & 0x03),
01018 (unsigned char)((ucLockUser & 0x30) >> 4),
01019 (unsigned char)(ucLockUser & 0x03));
01020 }
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051 int FedmIscTagHandler_EPC_Class1_Gen2::Lock(
01052 std::string sPassword,
01053 unsigned char ucKillMask,
01054 unsigned char ucKillAction,
01055 unsigned char ucAccessMask,
01056 unsigned char ucAccessAction,
01057 unsigned char ucEPCMask,
01058 unsigned char ucEPCAction,
01059 unsigned char ucTIDMask,
01060 unsigned char ucTIDAction,
01061 unsigned char ucUserMask,
01062 unsigned char ucUserAction )
01063 {
01064 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__);
01065
01066 int iErr = 0;
01067 unsigned char ucLockData[3];
01068
01069
01070 if(sPassword.length() > 0 && sPassword.length() % 2)
01071 {
01072 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
01073 return FEDM_ERROR_ODD_STRING_LENGTH;
01074 }
01075
01076 memset(ucLockData, 0, 3);
01077
01078 ucLockData[0] |= ((ucKillMask & 0x03) << 6);
01079 ucLockData[0] |= ((ucAccessMask & 0x03) << 4);
01080 ucLockData[0] |= ((ucEPCMask & 0x03) << 2);
01081 ucLockData[0] |= ((ucTIDMask & 0x03));
01082 ucLockData[1] |= ((ucUserMask & 0x03) << 6);
01083 ucLockData[1] |= ((ucKillAction & 0x03) << 4);
01084 ucLockData[1] |= ((ucAccessAction & 0x03) << 2);
01085 ucLockData[1] |= ((ucEPCAction & 0x03));
01086 ucLockData[2] |= ((ucTIDAction & 0x03) << 6);
01087 ucLockData[2] |= ((ucUserAction & 0x03) << 4);
01088
01089
01090 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE, (unsigned char)0));
01091 if(m_bNonAddressedMode)
01092 {
01093
01094 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
01095 }
01096 else
01097 {
01098 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
01099 if(m_pTabItem->m_ucSnrLen != 8)
01100 {
01101 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_EPC_LF, true));
01102 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC_LEN, m_pTabItem->m_ucSnrLen));
01103 }
01104 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
01105 }
01106
01107 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_TR_TYPE, (unsigned char)FEDM_ISC_TR_TYPE_EPC_CLASS1_GEN2));
01108 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_LOCK_DATA_LENGTH, (unsigned char)3));
01109 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_LOCK_DATA, ucLockData, 3));
01110
01111 if(sPassword.length() > 0)
01112 {
01113 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW, sPassword));
01114 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
01115 }
01116 else
01117 {
01118 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW_LENGTH, (unsigned char)0));
01119 }
01120
01121 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_CMD, (unsigned char)0x22));
01122
01123
01124 int iBack = m_pReader->SendProtocol(0xB3);
01125 if (iBack == 0x95)
01126 {
01127
01128 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
01129 }
01130
01131 return iBack;
01132 }
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156 int FedmIscTagHandler_EPC_Class1_Gen2::BlockPermalock(
01157 unsigned int uiBank,
01158 unsigned int uiBlockPointer,
01159 unsigned int uiBlockRange,
01160 std::string sPassword,
01161 unsigned char* pucMask )
01162 {
01163 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "Bank=" << uiBank << ", BlockPointer=" << uiBlockPointer << ", BlockRange=" << uiBlockRange);
01164
01165 FEDM_CHK3(pucMask);
01166
01167 int iErr = 0;
01168
01169
01170 if(uiBlockRange > 4)
01171 {
01172 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Block Range > 4");
01173 return FEDM_ERROR_PARAMETER;
01174 }
01175
01176
01177 if(sPassword.length() > 0 && sPassword.length() % 2)
01178 {
01179 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
01180 return FEDM_ERROR_ODD_STRING_LENGTH;
01181 }
01182
01183
01184 switch(uiBank)
01185 {
01186 case FEDM_ISC_ISO_BANK_RESERVED:
01187 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
01188 case FEDM_ISC_ISO_BANK_TID_MEMORY:
01189 case FEDM_ISC_ISO_BANK_USER_MEMORY:
01190 break;
01191 default:
01192 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid Bank Number");
01193 return FEDM_ERROR_PARAMETER;
01194 }
01195
01196
01197 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE, (unsigned char)0));
01198 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_EXT_ADR, true));
01199
01200 if(m_bNonAddressedMode)
01201 {
01202
01203 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
01204 }
01205 else
01206 {
01207 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
01208 if(m_pTabItem->m_ucSnrLen != 8)
01209 {
01210 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_EPC_LF, true));
01211 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC_LEN, m_pTabItem->m_ucSnrLen));
01212 }
01213 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
01214 }
01215
01216 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BANK, (unsigned char)0));
01217 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BANK_BANK_NR, uiBank));
01218
01219 if(sPassword.length() > 0)
01220 {
01221 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BANK_ACCESS_FLAG, true));
01222 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
01223 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW, sPassword));
01224 }
01225
01226 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BLOCK_PTR, uiBlockPointer));
01227 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BLOCK_RANGE, uiBlockRange));
01228 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_MASK, pucMask, 2*uiBlockRange));
01229
01230 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_CMD, (unsigned char)0x25));
01231
01232
01233 int iBack = m_pReader->SendProtocol(0xB3);
01234 if (iBack == 0x95)
01235 {
01236
01237 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
01238 }
01239
01240 return iBack;
01241 }
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265 int FedmIscTagHandler_EPC_Class1_Gen2::ReadPermalockStatus(
01266 unsigned int uiBank,
01267 unsigned int uiBlockPointer,
01268 unsigned int uiBlockRange,
01269 std::string sPassword,
01270 unsigned char* pucMask )
01271 {
01272 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "Bank=" << uiBank << ", BlockPointer=" << uiBlockPointer << ", BlockRange=" << uiBlockRange);
01273
01274 FEDM_CHK3(pucMask);
01275
01276 int iErr = 0;
01277
01278
01279 if(uiBlockRange > 4)
01280 {
01281 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Block Range > 4");
01282 return FEDM_ERROR_PARAMETER;
01283 }
01284
01285
01286 if(sPassword.length() > 0 && sPassword.length() % 2)
01287 {
01288 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid length of Password (=" << sPassword.length() << ")");
01289 return FEDM_ERROR_ODD_STRING_LENGTH;
01290 }
01291
01292
01293 switch(uiBank)
01294 {
01295 case FEDM_ISC_ISO_BANK_RESERVED:
01296 case FEDM_ISC_ISO_BANK_EPC_MEMORY:
01297 case FEDM_ISC_ISO_BANK_TID_MEMORY:
01298 case FEDM_ISC_ISO_BANK_USER_MEMORY:
01299 break;
01300 default:
01301 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - Invalid Bank Number");
01302 return FEDM_ERROR_PARAMETER;
01303 }
01304
01305
01306 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE, (unsigned char)0));
01307 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_EXT_ADR, true));
01308
01309 if(m_bNonAddressedMode)
01310 {
01311
01312 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
01313 }
01314 else
01315 {
01316 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
01317 if(m_pTabItem->m_ucSnrLen != 8)
01318 {
01319 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE_EPC_LF, true));
01320 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC_LEN, m_pTabItem->m_ucSnrLen));
01321 }
01322 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_EPC, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
01323 }
01324
01325 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BANK, (unsigned char)0));
01326 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BANK_BANK_NR, uiBank));
01327
01328 if(sPassword.length() > 0)
01329 {
01330 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BANK_ACCESS_FLAG, true));
01331 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW_LENGTH, (unsigned char)(sPassword.length()/2)));
01332 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_ACCESS_PW, sPassword));
01333 }
01334
01335 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BLOCK_PTR, uiBlockPointer));
01336 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_REQ_BLOCK_RANGE, uiBlockRange));
01337
01338 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_CMD, (unsigned char)0x26));
01339
01340
01341 int iBack = m_pReader->SendProtocol(0xB3);
01342 if(iBack == 0)
01343 {
01344 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B3_RSP_MASK, pucMask, 2*uiBlockRange));
01345 }
01346 else if (iBack == 0x95)
01347 {
01348
01349 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
01350 }
01351
01352 return iBack;
01353 }
01354
01355 #endif // #if !defined(_FEDM_NO_TAG_HANDLER_EPC_C1_G2)