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 #include "FedmIscTagHandler.h"
00040 #include "../FEDM_ISCReader.h"
00041 #include "../FEDM_ISOTabItem.h"
00042 #include "../FEDM_ISCReaderID.h"
00043 #include "../FEDM_ISC.h"
00044 #include "../../FEDM_Functions.h"
00045
00046
00047 #if _MSC_VER >= 1400
00048 #pragma warning(disable : 4996)
00049 #endif
00050
00051
00052 #if _MSC_VER <= 1200 // for Visual Studio 6
00053 const unsigned int FedmIscTagHandler::TYPE_BASIC = 1;
00054 const unsigned int FedmIscTagHandler::TYPE_EPC_CLASS1_GEN2 = 10;
00055 const unsigned int FedmIscTagHandler::TYPE_EPC_CLASS1_GEN2_IDS_SL900A = 11;
00056 const unsigned int FedmIscTagHandler::TYPE_ISO14443 = 20;
00057 const unsigned int FedmIscTagHandler::TYPE_ISO14443_INNOVATRON = 21;
00058 const unsigned int FedmIscTagHandler::TYPE_ISO14443_2 = 30;
00059 const unsigned int FedmIscTagHandler::TYPE_ISO14443_2_INNOVISION_JEWEL = 31;
00060 const unsigned int FedmIscTagHandler::TYPE_ISO14443_2_STM_SR176 = 32;
00061 const unsigned int FedmIscTagHandler::TYPE_ISO14443_2_STM_SRIxxx = 33;
00062 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3 = 40;
00063 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_INFINEON_MY_D = 41;
00064 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_INFINEON_MY_D_MOVE = 42;
00065 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_MIFARE_CLASSIC = 43;
00066 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_MIFARE_ULTRALIGHT = 44;
00067 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_MIFARE_PLUS_SL1 = 45;
00068 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_MIFARE_PLUS_SL2 = 46;
00069 const unsigned int FedmIscTagHandler::TYPE_ISO14443_3_ASK_CTX = 47;
00070 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4 = 50;
00071 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MIFARE_DESFIRE = 51;
00072 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MIFARE_PLUS_SL1 = 52;
00073 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MIFARE_PLUS_SL2 = 53;
00074 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MIFARE_PLUS_SL3 = 54;
00075 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MAXIM = 60;
00076 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MAXIM_MAX66000 = 61;
00077 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MAXIM_MAX66020 = 62;
00078 const unsigned int FedmIscTagHandler::TYPE_ISO14443_4_MAXIM_MAX66040 = 63;
00079 const unsigned int FedmIscTagHandler::TYPE_ISO18000_3M3 = 100;
00080 const unsigned int FedmIscTagHandler::TYPE_ISO15693 = 0xE0000000;
00081 const unsigned int FedmIscTagHandler::TYPE_ISO15693_STM = 0xE0020000;
00082 const unsigned int FedmIscTagHandler::TYPE_ISO15693_STM_LRI2K = 0xE0022000;
00083 const unsigned int FedmIscTagHandler::TYPE_ISO15693_STM_LRIS2K = 0xE0020280;
00084 const unsigned int FedmIscTagHandler::TYPE_ISO15693_STM_M24LR64R = 0xE00202C0;
00085 const unsigned int FedmIscTagHandler::TYPE_ISO15693_STM_LRIS64K = 0xE0020440;
00086 const unsigned int FedmIscTagHandler::TYPE_ISO15693_STM_M24LRxxER = 0xE00205C0;
00087 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP = 0xE0040000;
00088 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP_ICODE_SLI = 0xE0040100;
00089 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP_ICODE_SLIX = 0xE0040110;
00090 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP_ICODE_SLI_L = 0xE0040300;
00091 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP_ICODE_SLIX_L = 0xE0040310;
00092 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP_ICODE_SLI_S = 0xE0040200;
00093 const unsigned int FedmIscTagHandler::TYPE_ISO15693_NXP_ICODE_SLIX_S = 0xE0040210;
00094 const unsigned int FedmIscTagHandler::TYPE_ISO15693_Infineon = 0xE0050000;
00095 const unsigned int FedmIscTagHandler::TYPE_ISO15693_Infineon_my_d = 0xE005FFFF;
00096 const unsigned int FedmIscTagHandler::TYPE_ISO15693_TI = 0xE0070000;
00097 const unsigned int FedmIscTagHandler::TYPE_ISO15693_TI_Tag_it_HFI_Pro = 0xE007E000;
00098 const unsigned int FedmIscTagHandler::TYPE_ISO15693_TI_Tag_it_HFI_Plus = 0xE0078000;
00099 const unsigned int FedmIscTagHandler::TYPE_ISO15693_Fujitsu = 0xE0080000;
00100 const unsigned int FedmIscTagHandler::TYPE_ISO15693_Fujitsu_MB89R1xx = 0xE0080001;
00101 const unsigned int FedmIscTagHandler::TYPE_ISO15693_EM = 0xE0160000;
00102 const unsigned int FedmIscTagHandler::TYPE_ISO15693_EM_4034 = 0xE0160004;
00103 const unsigned int FedmIscTagHandler::TYPE_ISO15693_KSW = 0xE0170000;
00104 const unsigned int FedmIscTagHandler::TYPE_ISO15693_MAXIM = 0xE02B0000;
00105 const unsigned int FedmIscTagHandler::TYPE_ISO15693_MAXIM_MAX66100 = 0xE02B0010;
00106 const unsigned int FedmIscTagHandler::TYPE_ISO15693_MAXIM_MAX66120 = 0xE02B0020;
00107 const unsigned int FedmIscTagHandler::TYPE_ISO15693_MAXIM_MAX66140 = 0xE02B0030;
00108 const unsigned int FedmIscTagHandler::TYPE_ISO15693_IDS_SL13A = 0xE036FFFF;
00109 #endif
00110
00111
00112
00113
00114
00115
00116
00117
00118 _FEDM_ISC_CORE_EXT_CLASS FedmIscTagHandler::FedmIscTagHandler(FEDM_ISCReader* pReader, unsigned int uiTagHandlerType, FEDM_ISOTabItem* pTabItem)
00119 {
00120 if(pReader == NULL || pTabItem == NULL)
00121 throw FEDM_ERROR_NULL_POINTER;
00122
00123 m_uiTagHandlerType = uiTagHandlerType;
00124 m_pReader = pReader;
00125 m_pTabItem = pTabItem;
00126 m_sTagName = m_pReader->GetTagName(pTabItem->m_ucTrType);
00127
00128 m_bNonAddressedMode = false;
00129 m_uiErrorDBAddress = 0;
00130 m_ucISOErrorCode = 0;
00131 }
00132
00133 _FEDM_ISC_CORE_EXT_CLASS FedmIscTagHandler::~FedmIscTagHandler()
00134 {
00135 }
00136
00137 _FEDM_ISC_CORE_EXT_CLASS void FedmIscTagHandler::Init()
00138 {
00139
00140
00141 m_bNonAddressedMode = false;
00142 m_uiErrorDBAddress = 0;
00143 m_ucISOErrorCode = 0;
00144 }
00145
00146 _FEDM_ISC_CORE_EXT_CLASS unsigned int FedmIscTagHandler::GetTagHandlerType()
00147 {
00148 return m_uiTagHandlerType;
00149 }
00150
00151 _FEDM_ISC_CORE_EXT_CLASS unsigned int FedmIscTagHandler::GetTagDriverType()
00152 {
00153 return (unsigned int)m_pTabItem->m_ucTrType;
00154 }
00155
00156 #if defined(__BORLANDC__)
00157 const char* FedmIscTagHandler::GetTagName()
00158 #else
00159 _FEDM_ISC_CORE_EXT_CLASS const char* FedmIscTagHandler::GetTagName()
00160 #endif
00161 {
00162 return m_sTagName.c_str();
00163 }
00164
00165 #if defined(__BORLANDC__)
00166 const char* FedmIscTagHandler::GetUID()
00167 #else
00168 _FEDM_ISC_CORE_EXT_CLASS const char* FedmIscTagHandler::GetUID()
00169 #endif
00170 {
00171 int iBack = FEDM_ConvHexUCharToHexStr(m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen, m_sUid);
00172 if(iBack)
00173 return "";
00174
00175 return m_sUid.c_str();
00176 }
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 _FEDM_ISC_CORE_EXT_CLASS int FedmIscTagHandler::GetRSSI(unsigned char* ucNumber, unsigned char* ucStatus, unsigned char* ucRSSI)
00196 {
00197 int cnt = 0;
00198
00199 if(m_pTabItem->m_ucAntCount > 0)
00200 {
00201 for(cnt=0; cnt<m_pTabItem->m_ucAntCount; cnt++)
00202 {
00203 ucNumber[cnt] = m_pTabItem->m_ucAntNumber[cnt];
00204 ucStatus[cnt] = m_pTabItem->m_ucAntStatus[cnt];
00205 ucRSSI[cnt] = m_pTabItem->m_ucAntRSSI[cnt];
00206 }
00207
00208 return m_pTabItem->m_ucAntCount;
00209 }
00210
00211 return FEDM_ERROR_NO_DATA;
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 _FEDM_ISC_CORE_EXT_CLASS int FedmIscTagHandler::ReadMultipleBlocks(
00233 unsigned int uiFirstDataBlock,
00234 unsigned int uiNoOfDataBlocks,
00235 unsigned int& uiBlockSize,
00236 unsigned char* pucData )
00237 {
00238 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "FirstDataBlock=" << uiFirstDataBlock << ", NoOfDataBlocks=" << uiNoOfDataBlocks);
00239
00240 int iErr = 0;
00241
00242
00243 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00244
00245 if(m_bNonAddressedMode)
00246 {
00247
00248 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00249 }
00250 else if(m_pTabItem->m_bIsSelected)
00251 {
00252 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00253 }
00254 else
00255 {
00256 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00257 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00258 }
00259
00260 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR, uiFirstDataBlock));
00261 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00262
00263 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x23));
00264
00265
00266 int iBack = m_pReader->SendProtocol(0xB0);
00267 if(iBack == 0)
00268 {
00269
00270 uiBlockSize = m_pTabItem->m_ucBlockSize;
00271 memcpy(pucData, &m_pTabItem->m_ucRxDB[uiFirstDataBlock*m_pTabItem->m_ucBlockSize], uiNoOfDataBlocks * m_pTabItem->m_ucBlockSize);
00272 }
00273 else if (iBack == 0x95)
00274 {
00275
00276 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00277 }
00278
00279 return iBack;
00280 }
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301 _FEDM_ISC_CORE_EXT_CLASS int FedmIscTagHandler::ReadMultipleBlocks(
00302 unsigned int uiFirstDataBlock,
00303 unsigned int uiNoOfDataBlocks,
00304 unsigned int& uiBlockSize,
00305 unsigned char* pucSecurityStatus,
00306 unsigned char* pucData )
00307 {
00308 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "FirstDataBlock=" << uiFirstDataBlock << ", NoOfDataBlocks=" << uiNoOfDataBlocks);
00309
00310 int iErr = 0;
00311
00312
00313 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00314 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_SEC, true));
00315
00316 if(m_bNonAddressedMode)
00317 {
00318
00319 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00320 }
00321 else if(m_pTabItem->m_bIsSelected)
00322 {
00323 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00324 }
00325 else
00326 {
00327 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00328 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00329 }
00330
00331 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR, uiFirstDataBlock));
00332 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00333
00334 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x23));
00335
00336
00337 int iBack = m_pReader->SendProtocol(0xB0);
00338 if(iBack == 0)
00339 {
00340
00341 uiBlockSize = m_pTabItem->m_ucBlockSize;
00342 memcpy(pucSecurityStatus, &m_pTabItem->m_ucSecStatus[uiFirstDataBlock], uiNoOfDataBlocks);
00343 memcpy(pucData, &m_pTabItem->m_ucRxDB[uiFirstDataBlock*m_pTabItem->m_ucBlockSize], uiNoOfDataBlocks * m_pTabItem->m_ucBlockSize);
00344 }
00345 else if (iBack == 0x95)
00346 {
00347
00348 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00349 }
00350
00351 return iBack;
00352 }
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372 _FEDM_ISC_CORE_EXT_CLASS int FedmIscTagHandler::WriteMultipleBlocks(
00373 unsigned int uiFirstDataBlock,
00374 unsigned int uiNoOfDataBlocks,
00375 unsigned int uiBlockSize,
00376 unsigned char* pucData )
00377 {
00378 FEDM_TRACE_FNC(m_pReader->GetLogger(), FELOGMNG_DBG_FUNCTION_CALL | FELOGMNG_DBG_LF_COMM_TAG_HANDLER, __FUNCTION__, FELOGMNG_DBG_FUNCTION_PARAMETER, "FirstDataBlock=" << uiFirstDataBlock << ", NoOfDataBlocks=" << uiNoOfDataBlocks << ", BlockSize=" << uiBlockSize);
00379
00380 int iErr = 0;
00381
00382
00383 if( (uiFirstDataBlock + uiNoOfDataBlocks) * uiBlockSize > m_pTabItem->m_ucTxDB.size() )
00384 {
00385 FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - (uiFirstDataBlock + uiNoOfDataBlocks) * uiBlockSize > TxDB.size()");
00386 return FEDM_ERROR_ARRAY_BOUNDARY;
00387 }
00388
00389
00390 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00391 if(m_bNonAddressedMode)
00392 {
00393
00394 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00395 }
00396 else if(m_pTabItem->m_bIsSelected)
00397 {
00398 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00399 }
00400 else
00401 {
00402 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00403 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00404 }
00405
00406 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR, uiFirstDataBlock));
00407 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00408 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_SIZE, uiBlockSize));
00409
00410 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x24));
00411
00412 m_pTabItem->m_ucBlockSize = (unsigned char)uiBlockSize;
00413
00414
00415 memcpy(&m_pTabItem->m_ucTxDB[uiFirstDataBlock*uiBlockSize], pucData, uiNoOfDataBlocks * uiBlockSize);
00416
00417
00418 int iBack = m_pReader->SendProtocol(0xB0);
00419 if(iBack == 0x03)
00420 {
00421
00422
00423 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_RSP_DB_ADR_E, &m_uiErrorDBAddress));
00424 }
00425 else if (iBack == 0x95)
00426 {
00427
00428 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00429 }
00430
00431 return iBack;
00432 }