FedmIscTagHandler_EPC_Class1_Gen2.cpp
Go to the documentation of this file.
00001 /*-------------------------------------------------------
00002 |                                                       |
00003 |      FedmIscTagHandler_EPC_Class1_Gen2.cpp            |
00004 |                                                       |
00005 ---------------------------------------------------------
00006 
00007 Copyright © 2009-2013   FEIG ELECTRONIC GmbH, All Rights Reserved.
00008                                                 Lange Strasse 4
00009                                                 D-35781 Weilburg
00010                                                 Federal Republic of Germany
00011                                                 phone    : +49 6471 31090
00012                                                 fax      : +49 6471 310999
00013                                                 e-mail   : obid-support@feig.de
00014                                                 Internet : http://www.feig.de
00015                                         
00016 Author                  :       Markus Hultsch
00017 Begin                   :       30.03.2009
00018 
00019 Version                 :       04.04.03 / 21.02.2013 / M. Hultsch
00020                                                 - bugfix in WriteEPC: return of EPC-length as error code fixed
00021 
00022                                                 04.03.01 / 14.11.2012 / M. Hultsch
00023                                                 - Kill with extended parameter list for support of Recommissioning Bits
00024                                                 - new methods: GetTagModelNumber()
00025                                                                            GetMaskDesignerID()
00026                                                                            GetMaskDesignerName()
00027                                                                            IsUidWithTid()
00028                                                                            IsExtendedPC_W1()
00029                                                                            GetExtendedProtocolControlW1()
00030 
00031                                                 04.02.04 / 19.06.2012 / M. Hultsch
00032                                                 - new methods: BlockPermalock and ReadPermalockStatus
00033 
00034                                                 04.02.00 / 11.05.2012 / M. Hultsch
00035                                                 - accept a length of 0 for EPC in GetTidOfUid()
00036 
00037                                                 04.00.10 / 14.02.2012 / M. Hultsch
00038                                                 - check of string length of EPC and password in WriteEPC
00039                                                 - check of string length of password in all other commands
00040                                                 - support for external logmanager (FELOGMNG.dll), when #define _FELOGMNG_SUPPORT is set
00041 
00042                                                 04.00.07 / 12.12.2011 / M. Hultsch
00043                                                 - new method: simplified Lock
00044 
00045                                                 04.00.06 / 01.12.2011 / M. Hultsch
00046                                                 - bugfix in methods: ReadCompleteBank and ReadMultipleBlocks
00047 
00048                                                 04.00.03 / 26.09.2011 / M. Hultsch
00049                                                 - bugfix in method: ReadCompleteBank
00050 
00051                                                 04.00.02 / 11.08.2011 / M. Hultsch
00052                                                 - new method: ReadCompleteBank
00053 
00054                                                 04.00.00 / 21.07.2011 / M. Hultsch
00055                                                 - new methods: GetProtocolControl
00056                                                                            GetEpcOfUid
00057                                                                            GetTidOfUid
00058 
00059                                                 03.03.04 / 16.06.2011 / M. Hultsch
00060 
00061 Operation Systems       :       independent
00062 
00063 Function                        :       class for OBID i-scan® HF/UHF transponder EPC Class 1 Generation 2
00064 
00065 NOTE                            :       this class supports only addressed mode in Host-Mode
00066 
00067 
00068 Trademarks:
00069 -----------
00070 OBID®, OBID i-scan® and OBID myAXXESS® are registered Trademarks of FEIG ELECTRONIC GmbH
00071 Other Trademarks: see FEDM.h
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 // constants for Bank
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         // constants for [0x22] Lock
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 // class FedmIscTagHandler_EPC_Class1_Gen2
00106 // >> supports only ISO Host Commands <<
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 // protected constructor for internal use
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 // set all data members to 0
00132 /*void FedmIscTagHandler_EPC_Class1_Gen2::Init()
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   Begin                 :       16.06.2011 / M. Hultsch
00151 
00152   Version               :       03.03.04 / 16.06.2011 / M. Hultsch
00153 
00154   Function                      :       return the Protocol Control
00155 
00156   Parameters            :       -
00157 
00158   Return value          :       Protocol Control as unsigned int
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   Begin                 :       14.11.2012 / M. Hultsch
00167 
00168   Version               :       04.03.01 / 14.11.2012 / M. Hultsch
00169 
00170   Function                      :       return the Extended Protocol Control XPC_W1
00171 
00172   Parameters            :       -
00173 
00174   Return value          :       XPC_W1 as unsigned int
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   Begin                 :       15.07.2011 / M. Hultsch
00184 
00185   Version               :       04.00.00 / 21.07.2011 / M. Hultsch
00186 
00187   Function                      :       return the EPC, extracted from UID
00188 
00189   Parameters            :       -
00190 
00191   Return value          :       EPC or "" in error case
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   Begin                 :       15.07.2011 / M. Hultsch
00209 
00210   Version               :       04.02.00 / 11.05.2012 / M. Hultsch
00211                                                 - accept a length of 0 for EPC
00212 
00213                                                 04.00.00 / 21.07.2011 / M. Hultsch
00214 
00215   Function                      :       return the TID, extracted from UID
00216                                                 Note: returns "", if TID is not part of UID
00217 
00218   Parameters            :       -
00219 
00220   Return value          :       TID or "" in error case
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   Begin                 :       09.11.2012 / M. Hultsch
00240 
00241   Version               :       04.03.01 / 09.11.2012 / M. Hultsch
00242 
00243   Function                      :       return the Tag Model Number, based on information from TID
00244 
00245   Parameters            :       -
00246 
00247   Return value          :       Tag Model Number
00248 ***************************************************************************/
00249 unsigned int FedmIscTagHandler_EPC_Class1_Gen2::GetTagModelNumber()
00250 {
00251         return m_pTabItem->GetEpcC1G2TagModelNumber();
00252 }
00253 
00254 
00255 /***************************************************************************
00256   Begin                 :       09.11.2012 / M. Hultsch
00257 
00258   Version               :       04.03.01 / 09.11.2012 / M. Hultsch
00259 
00260   Function                      :       return the Mask Designer ID, based on information from TID
00261 
00262   Parameters            :       -
00263 
00264   Return value          :       Mask Designer ID
00265 ***************************************************************************/
00266 unsigned int FedmIscTagHandler_EPC_Class1_Gen2::GetMaskDesignerID()
00267 {
00268         return m_pTabItem->GetEpcC1G2MaskDesignerID();
00269 }
00270 
00271 
00272 /***************************************************************************
00273   Begin                 :       09.11.2012 / M. Hultsch
00274 
00275   Version               :       04.03.01 / 09.11.2012 / M. Hultsch
00276 
00277   Function                      :       return the Chip Manufacturer Name, based on Mask Designer ID from TID
00278 
00279   Parameters            :       -
00280 
00281   Return value          :       Chip Manufacturer Name
00282 ***************************************************************************/
00283 const char* FedmIscTagHandler_EPC_Class1_Gen2::GetMaskDesignerName()
00284 {
00285         return m_pTabItem->GetEpcC1G2MaskDesignerName();
00286 }
00287 
00288 
00289 /***************************************************************************
00290   Begin                 :       11.05.2009 / M. Hultsch
00291 
00292   Version               :       04.00.10 / 13.02.2012 / M. Hultsch
00293                                                 - check of string length of password
00294 
00295                                                 04.00.06 / 01.12.2011 / M. Hultsch
00296                                                 - bugfix for copy of data
00297 
00298                                                 04.00.03 / 26.09.2011 / M. Hultsch
00299 
00300   Function                      :       [0xB0][0x23] Read Multiple Blocks command
00301                                                 with READ_COMPLETE_BANK option
00302                                                 NOTE: block size is always 2
00303 
00304   Parameters            :       unsigned int uiBank                                             - [in] bank number
00305                                                 string sPassword                                                - [in] optional password
00306                                                 unsigned char* pucData                                  - [out] buffer with data blocks
00307                                                 unsigned int uiDataBufferSize                   - [in] size of buffer for data blocks (in Bytes)
00308                                                 unsigned int& uiNoOfDataBlocksRead              - [out] number of data blocks read
00309 
00310   Return value          :       0                               - if tramsmission was successful
00311                                                 status byte (>1)- if the reader signals a problem
00312                                                 error code (<0) - if something goes wrong
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         // test buffer size
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         // string with password must be even
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         // test bank number
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         // prepare ISO Host Command
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 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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)); // unused, but must be in protocol
00390         FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, (unsigned char)0)); // unused, but must be in protocol
00391         
00392         FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x23));
00393         
00394         // ... and execute
00395         int iBack = m_pReader->SendProtocol(0xB0);
00396         while(  iBack == 0x00 ||        // OK
00397                         iBack == 0x94)          // more data
00398         {
00399                 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_RSP_DBN, &uiNoOfDataBlocks));
00400 
00401                 if( (uiNoOfDataBlocks * 2) > uiDataBufferSize)
00402                 {
00403                         // copy received data blocks into buffer (up to buffer size)
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                         // return an error because of too small buffer
00423                         FEDM_TRACE(m_pReader->GetLogger(), FELOGMNG_DBG_ERROR, __FUNCTION__ << " - DataBuffer is too small");
00424                         return FEDM_ERROR_BUFFER_LENGTH;
00425                 }
00426 
00427                 // copy received data blocks into buffer
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                 // request next data blocks
00451                 // NOTE: block address is unused by reader, but important to add returned data into table,
00452                 //               because the start address is not part of the response protocol !!
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                 // ISO Error
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   Begin                 :       11.05.2009 / M. Hultsch
00473 
00474   Version               :       04.00.10 / 13.02.2012 / M. Hultsch
00475                                                 - check of string length of password
00476 
00477                                                 04.00.06 / 01.12.2011 / M. Hultsch
00478                                                 - bugfix for copy of data
00479 
00480                                                 03.01.00 / 11.05.2009 / M. Hultsch
00481 
00482   Function                      :       [0xB0][0x23] Read Multiple Blocks command
00483                                                 with support for extended address mode
00484                                                 NOTE: block size is always 2
00485 
00486   Parameters            :       unsigned int uiBank                                     - [in] bank number
00487                                                 unsigned int uiFirstDataBlock           - [in] first data block address
00488                                                 unsigned int uiNoOfDataBlocks           - [in] number of requested data blocks
00489                                                 string sPassword                                        - [in] optional password
00490                                                 unsigned char* pucData                          - [out] buffer with data blocks
00491 
00492   Return value          :       0                               - if tramsmission was successful
00493                                                 status byte (>1)- if the reader signals a problem
00494                                                 error code (<0) - if something goes wrong
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         // std::string with password must be even
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         // check of internal buffer capacity
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         // prepare ISO Host Command
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 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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         // ... and execute
00588         int iBack = m_pReader->SendProtocol(0xB0);
00589         if(iBack == 0)
00590         {
00591                 // copy received data blocks into buffer
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                 // ISO Error
00611                 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00612         }
00613 
00614         return iBack;
00615 }
00616 
00617 
00618 /***************************************************************************
00619   Begin                 :       11.05.2009 / M. Hultsch
00620 
00621   Version               :       04.00.10 / 13.02.2012 / M. Hultsch
00622                                                 - check of string length of password
00623 
00624                                                 03.01.00 / 07.10.2009 / M. Hultsch
00625 
00626   Function                      :       [0xB0][0x24] Write Multiple Blocks command
00627                                                 with support for extended address mode
00628                                                 NOTE: block size is always 2
00629 
00630   Parameters            :       unsigned int uiBank                                     - [in] bank number
00631                                                 unsigned int uiFirstDataBlock           - [in] first data block address
00632                                                 unsigned int uiNoOfDataBlocks           - [in] number of requested data blocks
00633                                                 string sPassword                                        - [in] optional password
00634                                                 unsigned char* pucData                          - [in] buffer with data blocks
00635 
00636   Return value          :       0                               - if tramsmission was successful
00637                                                 status byte (>1)- if the reader signals a problem
00638                                                 error code (<0) - if something goes wrong
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         // string with password must be even
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         // check of internal buffer capacity
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         // prepare ISO Host Command
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 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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         // save data blocks in internal memory
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         // ... and execute
00752         int iBack = m_pReader->SendProtocol(0xB0);
00753         if(iBack == 0x03)
00754         {
00755                 // if write error, save db address which causes the error
00756                 // one or two byte db address is supported
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                 // ISO Error
00762                 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00763         }
00764 
00765         return iBack;
00766 }
00767 
00768 
00769 /***************************************************************************
00770   Begin                 :       11.05.2009 / M. Hultsch
00771 
00772   Version               :       04.00.10 / 13.02.2012 / M. Hultsch
00773                                                 - check of string length of EPC and password
00774 
00775                                                 03.01.00 / 07.10.2009 / M. Hultsch
00776 
00777   Function                      :       write of an EPC into the EPC Memory
00778                                                 
00779                                                 uses [0xB0][0x24] Write Multiple Blocks command
00780                                                 with support for extended address mode
00781                                                 NOTE: block size is always 2
00782 
00783   Parameters            :       string sNewEpc                  - [in] new EPC number
00784                                                 string sPassword                - [in] optional password
00785 
00786   Return value          :       0                               - if tramsmission was successful
00787                                                 status byte (>1)- if the reader signals a problem
00788                                                 error code (<0) - if something goes wrong
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         // string with new EPC must contain complete blocks
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         // string with password must be even
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); // max 256 bit UID
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         // build Protocol-Control word
00824         ucClass1Gen2PC[0] |= (((sNewEPC.length()/4)&0x1F) << 3); // 5 bit length, rest 0
00825 //      ucClass1Gen2PC[1] |= (); // EPC Header according EPC Tag Data Standards
00826 
00827         // setup new EPC with PC in memory
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         // prepare ISO Host Command
00837 
00838         FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00839         if(m_bNonAddressedMode)
00840         {
00841 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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                 // ISO Error
00876                 m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode);
00877         }
00878 
00879         return iBack;
00880 }
00881 
00882 
00883 /***************************************************************************
00884   Begin                 :       11.05.2009 / M. Hultsch
00885 
00886   Version               :       04.03.01 / 01.11.2012 / M. Hultsch
00887                                                 - extended parameter list for support of Recommissioning Bits
00888 
00889                                                 04.00.10 / 13.02.2012 / M. Hultsch
00890                                                 - check of string length of password
00891 
00892                                                 03.01.00 / 07.10.2009 / M. Hultsch
00893 
00894   Function                      :       Kill of tag
00895                                                 
00896                                                 uses [0xB3][0x18] Kill command
00897 
00898   Parameters            :       string sPassword                - [in] optional password
00899                                                 bool bRecom_AssertedLSB - [in] optional: recommissioning bit Asserted LSB
00900                                                 bool bRecom_Asserted2SB - [in] optional: recommissioning bit Asserted 2SB
00901                                                 bool bRecom_Asserted3SB - [in] optional: recommissioning bit Asserted 3SB
00902 
00903   Return value          :       0                               - if tramsmission was successful
00904                                                 status byte (>1)- if the reader signals a problem
00905                                                 error code (<0) - if something goes wrong
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         // string with password must be even
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         // prepare ISO Host Command
00926         FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE, (unsigned char)0));
00927 
00928         if(m_bNonAddressedMode)
00929         {
00930 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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         // ... and execute
00974         int iBack = m_pReader->SendProtocol(0xB3);
00975         if (iBack == 0x95)
00976         {
00977                 // ISO Error
00978                 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
00979         }
00980 
00981         return iBack;
00982 }
00983 
00984 /***************************************************************************
00985   Begin                         :       09.12.2011 / M. Hultsch
00986 
00987   Version                       :       04.00.07 / 09.12.2011 / M. Hultsch
00988 
00989   Function                      :       [0xB3][0x22] Lock (simplified Lock method)
00990                                                 - wrapper for Lock method
00991 
00992   Parameters            :       string Password
00993                                                 byte lockKill           - [in] lock settings for kill
00994                                                 byte lockAccess         - [in] lock settings for access pasword
00995                                                 byte lockEPC            - [in] lock settings for  EPC memory
00996                                                 byte lockTID            - [in] lock settings for TID memory
00997                                                 byte lockUser           - [in] lock settings for User memory
00998 
00999   Return Value          :       int status/error code value
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   Begin                 :       11.05.2009 / M. Hultsch
01025 
01026   Version               :       04.00.10 / 13.02.2012 / M. Hultsch
01027                                                 - check of string length of password
01028 
01029                                                 03.02.08 / 30.11.2010 / M. Hultsch
01030 
01031   Function                      :       Lock of tag (Lock method according EPC Class1 Gen2 specification)
01032                                                 
01033                                                 uses [0xB3][0x22] Lock command
01034 
01035   Parameters            :       string sPassword                                - [in] optional password
01036                                                 unsigned char ucKillMask                - [in] 2 Bit mask settings for kill
01037                                                 unsigned char ucKillAction              - [in] 2 Bit action settings for kill
01038                                                 unsigned char ucAccessMask              - [in] 2 Bit mask settings for access pasword
01039                                                 unsigned char ucAccessAction    - [in] 2 Bit action settings for access pasword
01040                                                 unsigned char ucEPCMask                 - [in] 2 Bit mask settings for  EPC memory
01041                                                 unsigned char ucEPCAction               - [in] 2 Bit action settings for  EPC memory
01042                                                 unsigned char ucTIDMask                 - [in] 2 Bit mask settings for TID memory
01043                                                 unsigned char ucTIDAction               - [in] 2 Bit action settings for TID memory
01044                                                 unsigned char ucUserMask                - [in] 2 Bit mask settings for User memory
01045                                                 unsigned char ucUserAction              - [in] 2 Bit action settings for User memory
01046 
01047   Return value          :       0                               - if tramsmission was successful
01048                                                 status byte (>1)- if the reader signals a problem
01049                                                 error code (<0) - if something goes wrong
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         // string with password must be even
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         // prepare ISO Host Command
01090         FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B3_MODE, (unsigned char)0));
01091         if(m_bNonAddressedMode)
01092         {
01093 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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         // ... and execute
01124         int iBack = m_pReader->SendProtocol(0xB3);
01125         if (iBack == 0x95)
01126         {
01127                 // ISO Error
01128                 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
01129         }
01130 
01131         return iBack;
01132 }
01133 
01134 
01135 /***************************************************************************
01136   Begin                 :       21.06.2012 / M. Hultsch
01137 
01138   Version               :       04.02.04 / 21.06.2012 / M. Hultsch
01139 
01140   Function                      :       Set blocks to permalock
01141                                                 - optional command according EPC Class1 Gen2 spec and not supported by all tags
01142                                                 
01143                                                 uses [0xB3][0x25] Block Permalock command
01144                                                 NOTE: mask is limited to 8 bytes
01145 
01146   Parameters            :       unsigned int uiBank                                     - [in] bank number
01147                                                 unsigned int uiBlockPointer                     - [in] first block (consider: vendor specific block size)
01148                                                 unsigned int uiBlockRange                       - [in] number of blocks (limited to 4)
01149                                                 string sPassword                                        - [in] optional password
01150                                                 unsigned char* pucMask                          - [in] buffer with mask
01151 
01152   Return value          :       0                               - if tramsmission was successful
01153                                                 status byte (>1)- if the reader signals a problem
01154                                                 error code (<0) - if something goes wrong
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         // test buffer size
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         // string with password must be even
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         // test bank number
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         // prepare ISO Host Command
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 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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         // ... and execute
01233         int iBack = m_pReader->SendProtocol(0xB3);
01234         if (iBack == 0x95)
01235         {
01236                 // ISO Error
01237                 m_pReader->GetData(FEDM_ISC_TMP_B3_TAG_ERROR, &m_ucISOErrorCode);
01238         }
01239 
01240         return iBack;
01241 }
01242 
01243 
01244 /***************************************************************************
01245   Begin                 :       21.06.2012 / M. Hultsch
01246 
01247   Version               :       04.02.04 / 21.06.2012 / M. Hultsch
01248 
01249   Function                      :       Read blocks permalock status
01250                                                 - optional command according EPC Class1 Gen2 spec and not supported by all tags
01251                                                 
01252                                                 uses [0xB0][0x26] Read Permalock Status command
01253                                                 NOTE: mask is limited to 8 bytes
01254 
01255   Parameters            :       unsigned int uiBank                                     - [in] bank number
01256                                                 unsigned int uiBlockPointer                     - [in] first block (consider: vendor specific block size)
01257                                                 unsigned int uiBlockRange                       - [in] number of blocks (limited to 4)
01258                                                 string sPassword                                        - [in] optional password
01259                                                 unsigned char* pucMask                          - [out] buffer for mask
01260 
01261   Return value          :       0                               - if tramsmission was successful
01262                                                 status byte (>1)- if the reader signals a problem
01263                                                 error code (<0) - if something goes wrong
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         // test buffer size
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         // string with password must be even
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         // test bank number
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         // prepare ISO Host Command
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 //              m_pReader->SetNonAddressedTabIndex(m_pTabItem->m_uiTabIndex);
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         // ... and execute
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                 // ISO Error
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)


rfid_drivers
Author(s): Raul Perula-Martinez
autogenerated on Thu Apr 2 2015 03:06:13