packages feed

mercury-api-0.1.0.0: cbits/api/tmr_tagop.h

#ifndef _TMR_TAGOP_H
#define _TMR_TAGOP_H
/** 
 *  @file tmr_tagop.h
 *  @brief Mercury API - Tag Operations Interface
 *  @author Nathan Williams
 *  @date 1/8/2010
 */

/*
 * Copyright (c) 2009 ThingMagic, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
#include "tmr_tag_auth.h"
#include "osdep.h"

#ifdef  __cplusplus
extern "C" {
#endif

/** The type of a tag operation structure */
typedef enum TMR_TagOpType
{
  /** Gen2 EPC write */
  TMR_TAGOP_GEN2_WRITETAG,
  /** Gen2 memory read */
  TMR_TAGOP_GEN2_READDATA,
  /** Gen2 memory write */
  TMR_TAGOP_GEN2_WRITEDATA,
  /** Gen2 memory lock/unlock */
  TMR_TAGOP_GEN2_LOCK,
  /** Gen2 tag kill */
  TMR_TAGOP_GEN2_KILL,
  /** Gen2 tag block write */
  TMR_TAGOP_GEN2_BLOCKWRITE,
  /** Gen2 tag block permalock */
  TMR_TAGOP_GEN2_BLOCKPERMALOCK,
  /** Gen2 tag block erase */
  TMR_TAGOP_GEN2_BLOCKERASE,
  /** Higgs2 Partial Load Image */
  TMR_TAGOP_GEN2_ALIEN_HIGGS2_PARTIALLOADIMAGE,
  /** Higgs2 Full Load Image */
  TMR_TAGOP_GEN2_ALIEN_HIGGS2_FULLLOADIMAGE,
  /** Higgs3 Fast Load Image */
  TMR_TAGOP_GEN2_ALIEN_HIGGS3_FASTLOADIMAGE,
  /** Higgs3 Load Image */
  TMR_TAGOP_GEN2_ALIEN_HIGGS3_LOADIMAGE,
  /** Higgs3 Block Read Lock */
  TMR_TAGOP_GEN2_ALIEN_HIGGS3_BLOCKREADLOCK,

  /** NXP set read protect */
  TMR_TAGOP_GEN2_NXP_SETREADPROTECT,
  /** NXP reset read protect */
  TMR_TAGOP_GEN2_NXP_RESETREADPROTECT,
  /** NXP Change EAS */
  TMR_TAGOP_GEN2_NXP_CHANGEEAS,
  /** NXP EAS Alarm */
  TMR_TAGOP_GEN2_NXP_EASALARM,
  /** NXP Calibrate */
  TMR_TAGOP_GEN2_NXP_CALIBRATE,
  /** NXP ChangeConfig */
  TMR_TAGOP_GEN2_NXP_CHANGECONFIG,

/** NXP AES Gen2v2 untraceable operations */
  TMR_TAGOP_GEN2_NXP_UNTRACEABLE,
  /** NXP AES Gen2v2 Authenticate operations */
  TMR_TAGOP_GEN2_NXP_AUTHENTICATE,
  /** NXP AES Gen2v2 ReadBuffer operations */
  TMR_TAGOP_GEN2_NXP_READBUFFER,


  /** Monza4 QT Read/Write*/
  TMR_TAGOP_GEN2_IMPINJ_MONZA4_QTREADWRITE,

  /** ISO180006B memory read */
  TMR_TAGOP_ISO180006B_READDATA,
  /** ISO180006B memory write */
  TMR_TAGOP_ISO180006B_WRITEDATA,
  /** ISO180006B memory lock/unlock */
  TMR_TAGOP_ISO180006B_LOCK,
  /** ISO180006B tag kill */
  /** Gen2 Secure read */
  TMR_TAGOP_GEN2_SECURE_READDATA,

  /** Gen2 IAVDenatran ActivateSecureMode - PA Protocol */
  TMR_TAGOP_GEN2_DENATRAN_IAV_ACTIVATESECUREMODE,
  /** Gen2 IAVDenatran Authenticate OBU - PA Protocol */
  TMR_TAGOP_GEN2_DENATRAN_IAV_AUTHENTICATEOBU,
  /** Gen2 IAVDenatran GEN2_ACTIVATE_SINIAV_MODE - G0 Protocol */
  TMR_TAGOP_GEN2_ACTIVATE_SINIAV_MODE,
  /** Gen2 IAVDenatran GEN2_OBU_AUTH_ID - G0 Protocol */
  TMR_TAGOP_GEN2_OBU_AUTH_ID,
  /** Gen2 IAVDenatran GEN2_AUTHENTICATE_OBU_FULL_PASS1 - G0 Protocol */
  TMR_TAGOP_GEN2_AUTHENTICATE_OBU_FULL_PASS1,
  /** Gen2 IAVDenatran GEN2_AUTHENTICATE_OBU_FULL_PASS2 - G0 Protocol */
  TMR_TAGOP_GEN2_AUTHENTICATE_OBU_FULL_PASS2,
  /** Gen2 IAVDenatran GEN2_OBU_READ_FROM_MEM_MAP - G0 Protocol */
  TMR_TAGOP_GEN2_OBU_READ_FROM_MEM_MAP,
  /** Gen2 IAVDenatran GEN2_OBU_WRITE_TO_MEM_MAP - G0 Protocol */
  TMR_TAGOP_GEN2_OBU_WRITE_TO_MEM_MAP,
  /** Gen2 IAVDenatran GET_TOKEN_ID - G0 Protocol */
  TMR_TAGOP_GEN2_DENATRAN_IAV_GET_TOKEN_ID,
  /** Gen2 IAVDenatran AUTHENTICATE_OBU_FULL_PASS */
  TMR_TAGOP_GEN2_DENATRAN_IAV_AUTHENTICATE_OBU_FULL_PASS,
  /** Gen2 IAVDenatran Read Sec - IP63 protocol */
  TMR_TAGOP_GEN2_DENATRAN_IAV_READ_SEC,
  /** Gen2 IAVDenatran Write Sec - IP63 protocol */
  TMR_TAGOP_GEN2_DENATRAN_IAV_WRITE_SEC,
  /** Gen2 IAVDenatran GEN2_G0_PA_OBU_AUTHENTICATE_ID - ( PA + G0 ) Protocol */
  TMR_TAGOP_GEN2_DENATRAN_IAV_G0_PA_OBU_AUTHENTICATE_ID,
  
  /** Gen2 Ids get sensor type */
  TMR_TAGOP_GEN2_IDS_SL900A_GETSENSOR,
  /** Gen2 Ids get log state */
  TMR_TAGOP_GEN2_IDS_SL900A_GETLOGSTATE,
  /** Gen2 Ids set log mode */
  TMR_TAGOP_GEN2_IDS_SL900A_SETLOGMODE,
  /** Gen2 Ids end log */
  TMR_TAGOP_GEN2_IDS_SL900A_ENDLOG,
  /** Gen2 Ids Initialize */
  TMR_TAGOP_GEN2_IDS_SL900A_INITIALIZE,
  /** Gen2 Ids Fifo Status */
  TMR_TAGOP_GEN2_IDS_SL900A_ACCESSFIFOSTATUS,
  /** Gen2 Ids Fifo Read */
  TMR_TAGOP_GEN2_IDS_SL900A_ACCESSFIFOREAD,
  /** Gen2 Ids Fifo write */
  TMR_TAGOP_GEN2_IDS_SL900A_ACCESSFIFOWRITE,
  /** Gen2 Ids Starrt Log */
  TMR_TAGOP_GEN2_IDS_SL900A_STARTLOG,
  /** Gen2 Ids GetCalibrationData */
  TMR_TAGOP_GEN2_IDS_SL900A_GETCALIBRATIONDATA,
  /** Gen2 Ids SetCalibration */
  TMR_TAGOP_GEN2_IDS_SL900A_SETCALIBRATIONDATA,
  /** Gen2 Ids SetSfeParameters */
  TMR_TAGOP_GEN2_IDS_SL900A_SETSFEPARAMETERS,
  /** Gen2 Ids GetMeasurmentSetup */
  TMR_TAGOP_GEN2_IDS_SL900A_GETMEASUREMENTSETUP,
  /** Gen2 Ids GetBattery Level */
  TMR_TAGOP_GEN2_IDS_SL900A_GETBATTERYLEVEL,
  /** Gen2 Ids SetLogLimits */
  TMR_TAGOP_GEN2_IDS_SL900A_SETLOGLIMITS,
  /** Gen2 Ids SetShelfLife */
  TMR_TAGOP_GEN2_IDS_SL900A_SETSHELFLIFE,
  /** Set IDS Password */
  TMR_TAGOP_GEN2_IDS_SL900A_SETPASSWORD,


  /** List of tag operations */
  TMR_TAGOP_LIST
} TMR_TagOpType;

/** The type of Gen2 Secure operation  */
typedef enum SecureTagType
{
  GEN2_EMBEDDED_SECURE_DEFAULT = 0x00,
  /* Alien Higgs 3 secure access */
  GEN2_EMBEDDED_SECURE_HIGGS3_ACCESS   = (1 << 1),
  /* Monza 4 secure access */
  GEN2_EMBEDDED_SECURE_MONZA4_ACCESS   = (1 << 2)
}SecureTagType;
 
/* The type of Gen2 IAVDenatranCmdEnum */
typedef enum IAVDenatranSecureTagOpType
{
  /* Activate Secure Mode - PA Protocol */
  GEN2_ACTIVATE_SECURE_MODE  = 0x00,
  /* Authenticate OBU - PA Protocol */
  GEN2_AUTHENTICATE_OBU  = 0x01,
  /* Activate Siniav Mode OBU - G0 Protocol */
  GEN2_ACTIVATE_SINIAV_MODE = 0x02,
  /* Authenticate OBU ID - G0 Protocol */
  GEN2_OBU_AUTH_ID = 0x03,
  /* Authenticate OBU FullPass1 - G0 Protocol */
  GEN2_AUTHENTICATE_OBU_FULL_PASS1 = 0x04,
  /* Authenticate OBU FullPass2 - G0 Protocol */
  GEN2_AUTHENTICATE_OBU_FULL_PASS2 = 0x05,
  /* Read From Mem - G0 Protocol */
  GEN2_OBU_READ_FROM_MEM_MAP = 0x06,
  /* Write to Mem - G0 Protocol */
  GEN2_OBU_WRITE_TO_MEM_MAP = 0x07,
  /* Authenticate OBU FullPass2 - G0 Protocol */
  GEN2_AUTHENTICATE_OBU_FULL_PASS = 0x08,
  /* Get token ID - Go Protocol */
  GEN2_GET_TOKEN_ID = 0x09,
  /* Read Sec - IP63 Protocol */
  GEN2_READ_SEC = 0x0A,
  /* Write Sec - IP63 Protocol */
  GEN2_WRITE_SEC = 0x0B,
  /* Pa G0 - (PA + G0) Protocol */
  GEN2_PA_G0_AUTHENTICATE = 0x0C,
}IAVDenatranSecureTagOpType;

/* The type of Gen2 secure password  */
typedef enum SecurePasswordType
{
  /* Gen2 password type */
  TMR_SECURE_GEN2_PASSWORD = 0x01,
  /* Look up table password */
  TMR_SECURE_GEN2_LOOKUP_TABLE_PASSWORD = 0x02
}SecurePasswordType;

/* The fild type of calibration data that user can modify */
typedef enum CalibrationParameter
{
  /* AD1 lower voltage reference - coarse */
  TMR_GEN2_IDS_SL900A_CALIBRATION_COARSE1,
  /* AD2 lower voltage reference - coarse */
  TMR_GEN2_IDS_SL900A_CALIBRATION_COARSE2,
  /* Switches the lower AD voltage reference to ground */
  TMR_GEN2_IDS_SL900A_CALIBRATION_GNDSWITCH,
  /* POR voltage level for 1.5V system */
  TMR_GEN2_IDS_SL900A_CALIBRATION_SELP12,
  /* RTC oscillator calibration */
  TMR_GEN2_IDS_SL900A_CALIBRATION_DF,
  /* Controlled battery supply for external sensor - the battery voltage is connected to the EXC pin */
  TMR_GEN2_IDS_SL900A_CALIBRATION_SWEXTEN,
  /* POR voltage level for 3V system */
  TMR_GEN2_IDS_SL900A_CALIBRATION_SELP22,
  /* Voltage level interrupt level for external sensor -- ratiometric */
  TMR_GEN2_IDS_SL900A_CALIBRATION_IRLEV,
  /* Excitate for resistive sensors without DC */
  TMR_GEN2_IDS_SL900A_CALIBRATION_EXCRES,
}CalibrationParameter;

/* The field type of sfe parameters that user can modify */
typedef enum SfeParameter
{
  /* External sensor 2 range */
  TMR_GEN2_IDS_SL900A_SFE_RANG,
  /* External sensor 1 range */
  TMR_GEN2_IDS_SL900A_SFE_SETI,
  /* External sensor 1 type */
  TMR_GEN2_IDS_SL900A_SFE_EXT1,
  /* External sensor 2 type */
  TMR_GEN2_IDS_SL900A_SFE_EXT2,
  /* Use preset range */
  TMR_GEN2_IDS_SL900A_SFE_AUTORANGEDISABLE,
  /* Sensor used in limit check */
  TMR_GEN2_IDS_SL900A_SFE_VERIFYSENSORID,
}SfeParameter;

typedef struct TMR_TagOp_GEN2_NXP_Tam1Authentication
{
	uint8_t Authentication;
	uint8_t CSI;
	uint8_t keyID;
	uint8_t KeyLength;
	uint8_t IchallengeLength;
	TMR_uint8List  Key;
	TMR_uint8List Ichallenge;
} TMR_TagOp_GEN2_NXP_Tam1Authentication;

typedef struct TMR_TagOp_GEN2_NXP_Tam2Authentication
{
	TMR_TagOp_GEN2_NXP_Tam1Authentication tam1Auth;
	uint16_t Offset;
	uint8_t ProtMode;
	uint8_t BlockCount;
	TMR_NXP_Profile profile;
} TMR_TagOp_GEN2_NXP_Tam2Authentication;

typedef enum TMR_GEN2_UNTRACEABLE_AuthType
{
	/* Tag exposes EPC memory */
	UNTRACEABLE_WITH_AUTHENTICATION = 0,
	/*Tag untraceably hides EPC memory above that*/
	UNTRACEABLE_WITH_ACCESS = 1

}TMR_GEN2_UNTRACEABLE_AuthType;
typedef struct TMR_TagOp_GEN2_NXP_UNTRACEABLE_Authentication
{   
	TMR_GEN2_UNTRACEABLE_AuthType authType;
	TMR_TagOp_GEN2_NXP_Tam1Authentication tam1Auth;
	TMR_GEN2_Password accessPassword;

}TMR_TagOp_GEN2_NXP_UNTRACEABLE_Authentication;

typedef struct TMR_TagOp_GEN2_NXP_Untraceable
{
	TMR_TagOp_GEN2_NXP_UNTRACEABLE_Authentication auth; 
	TMR_GEN2_UNTRACEABLE_Epc epc;
	int32_t epcLength;
	TMR_GEN2_UNTRACEABLE_Tid tid;
	TMR_GEN2_UNTRACEABLE_UserMemory userMemory;
	TMR_GEN2_UNTRACEABLE_Range range;
	uint8_t subCommand;

} TMR_TagOp_GEN2_NXP_Untraceable;

typedef enum TMR_GEN2_AUTHENTICATE_Type
{
	TAM1_AUTHENTICATION,
	TAM2_AUTHENTICATION
}TMR_GEN2_AUTHENTICATE_Type;

typedef struct TMR_TagOp_GEN2_NXP_Authenticate
{
	TMR_GEN2_AUTHENTICATE_Type type;
	TMR_TagOp_GEN2_NXP_Tam1Authentication tam1Auth;
	TMR_TagOp_GEN2_NXP_Tam2Authentication tam2Auth;
	uint8_t subCommand;
}TMR_TagOp_GEN2_NXP_Authenticate;

typedef struct TMR_TagOp_GEN2_NXP_Readbuffer
{
	uint16_t wordPointer;
	uint16_t bitCount;
	TMR_TagOp_GEN2_NXP_Authenticate authenticate;

}TMR_TagOp_GEN2_NXP_Readbuffer;

/** Parameters of a Gen2 EPC write operation */
typedef struct TMR_TagOp_GEN2_WriteTag
{
  /** Tag EPC */
  TMR_TagData* epcptr;
} TMR_TagOp_GEN2_WriteTag;

/** Parameters of a Gen2 memory read operation */
typedef struct TMR_TagOp_GEN2_ReadData
{
  /** Gen2 memory bank to read from */
  TMR_GEN2_Bank bank;
  /** Word address to start reading at */
  uint32_t wordAddress;
  /** Number of words to read */
  uint8_t len;
} TMR_TagOp_GEN2_ReadData;

/** Parameters of Gen2 Secure operation */

/* Parameters of SecurePassWordLookup Table */
typedef struct SecurePasswordLookup
{
  /* used in case Gen2 passWord */
  TMR_TagAuthentication gen2PassWord;

  /* used in case of password look table */
  /* Number of bits used to address the AP list (MSB byte - byte 4) */
  uint8_t secureAddressLength;
  /* EPC word offset (Next MSB byte - byte 3) */
  uint8_t secureAddressOffset;
  /*  User flash offset, starting from 0x0000 (LSB 2 bytes) */
   uint16_t secureFlashOffset;
} SecurePasswordLookup;

typedef struct TMR_TagOp_GEN2_SecureReadData
{
  /** Gen2 read operation */
  TMR_TagOp_GEN2_ReadData readData;

  /** type of Gen2 Secure operation*/
  /* Options to select Alien Higgs 3 secure access and Monza 4 secure access */
  SecureTagType type;
  /* option to select Gen2 password or look up table password */
  SecurePasswordType passwordType;
  /* Options to specify the password */
  SecurePasswordLookup password;
 } TMR_TagOp_GEN2_SecureReadData;

/** Parameters of a Gen2 memory write operation */
typedef struct TMR_TagOp_GEN2_WriteData
{
  /** Gen2 memory bank to write to */
  TMR_GEN2_Bank bank;
  /** Word address to start writing at */
  uint32_t wordAddress;
  /** Data to write */
  TMR_uint16List data;
} TMR_TagOp_GEN2_WriteData;

/** Parameters of a Gen2 memory lock/unlock operation */
typedef struct TMR_TagOp_GEN2_Lock
{ 
  /** Bitmask indicating which lock bits to change */
  uint16_t mask;
  /** New values of each bit specified in the mask */
  uint16_t action;
  /** Access Password to use to lock the tag*/
  TMR_GEN2_Password accessPassword;
} TMR_TagOp_GEN2_Lock;

/** Parameters of a Gen2 tag kill operation */
typedef struct TMR_TagOp_GEN2_Kill
{
  /** Kill password to use to kill the tag */
  TMR_GEN2_Password password;
} TMR_TagOp_GEN2_Kill;

/** Parameters of a Gen2 tag Block Write operation */
typedef struct TMR_TagOp_GEN2_BlockWrite
{
  /** Gen2 memory bank to write to */
  TMR_GEN2_Bank bank; 
  /** The word address to start writing to */
  uint32_t wordPtr; 
  /** The data to write */
  TMR_uint16List data; 
}TMR_TagOp_GEN2_BlockWrite;

/** Parameters of a Gen2 tag Block PermaLock operation */
typedef struct TMR_TagOp_GEN2_BlockPermaLock
{
  /** Read lock status or write it? */
  uint8_t readLock; 
  /** Gen2 memory bank to lock */
  TMR_GEN2_Bank bank; 
  /** The starting word address to lock */
  uint32_t blockPtr;
  /** Mask: Which blocks to lock? */
  TMR_uint16List mask;
}TMR_TagOp_GEN2_BlockPermaLock;

/** Parameters of a Gen2 tag Block Erase operation */
typedef struct TMR_TagOp_GEN2_BlockErase
{
  /** Gen2 memory bank to erase */
  TMR_GEN2_Bank bank;
  /** The starting word address for block erase */
  uint32_t wordPtr;
  /** Number of words to erase */
  uint8_t wordCount;
} TMR_TagOp_GEN2_BlockErase;

/** Parameters of a Gen2 memory lock/unlock operation */
typedef struct TMR_TagOp_ISO180006B_Lock
{ 
  /** The memory address of the byte to lock */
  uint8_t address;
} TMR_TagOp_ISO180006B_Lock;

/** Parameters of an ISO180006B memory read operation */
typedef struct TMR_TagOp_ISO180006B_ReadData
{
  /** Byte address to start reading at */
  uint8_t byteAddress;
  /** Number of bytes to read */
  uint8_t len;
} TMR_TagOp_ISO180006B_ReadData;

/** Parameters of an ISO180006B memory write operation */
typedef struct TMR_TagOp_ISO180006B_WriteData
{
  /** Byte address to start writing at */
  uint8_t byteAddress;
  /** Data to write */
  TMR_uint8List data;
} TMR_TagOp_ISO180006B_WriteData;

/**
 *  Tagops for Gen2 custom commands
 **/

/** Parameters for Alien Higgs2, Partial Load Image command*/
typedef struct TMR_TagOp_GEN2_Alien_Higgs2_PartialLoadImage
{
  /** Kill password to write to the tag */
  TMR_GEN2_Password killPassword;
  /** Access password to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** Tag EPC to write to the tag*/
  TMR_TagData* epcptr;
} TMR_TagOp_GEN2_Alien_Higgs2_PartialLoadImage;

/** Parameters for Alien Higgs2, Full Load Image command*/
typedef struct TMR_TagOp_GEN2_Alien_Higgs2_FullLoadImage
{
  /** Kill password to write to the tag */
  TMR_GEN2_Password killPassword;
  /** Access password to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** Lock Bits */
  uint16_t lockBits;
  /** PC word */
  uint16_t pcWord;
  /** Tag EPC to write to the tag*/
  TMR_TagData* epcptr;
} TMR_TagOp_GEN2_Alien_Higgs2_FullLoadImage;

/** Parameters for Alien Higgs3, Fast Load Image command*/
typedef struct TMR_TagOp_GEN2_Alien_Higgs3_FastLoadImage
{
  /** Access password used to write to the tag */
  TMR_GEN2_Password currentAccessPassword;
  /** Kill password to write to the tag */
  TMR_GEN2_Password killPassword;
  /** Access password to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** PC word */
  uint16_t pcWord;
  /** Tag EPC to write to the tag*/
  TMR_TagData* epcptr;
} TMR_TagOp_GEN2_Alien_Higgs3_FastLoadImage;


/** Parameters for Alien Higgs3, Load Image command*/
typedef struct TMR_TagOp_GEN2_Alien_Higgs3_LoadImage
{
  /** Access password used to write to the tag */
  TMR_GEN2_Password currentAccessPassword;
  /** Kill password to write to the tag */
  TMR_GEN2_Password killPassword;
  /** Access password to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** PC word */
  uint16_t pcWord;
  /** Tag EPC and user data to write to the tag (76 bytes)*/
  TMR_uint8List *epcAndUserData;
} TMR_TagOp_GEN2_Alien_Higgs3_LoadImage;

/** Parameters for Alien Higgs3, Block Read Lock command*/
typedef struct TMR_TagOp_GEN2_Alien_Higgs3_BlockReadLock
{
  /** Access password to use to write to the tag, in case if the tag is already locked */
  TMR_GEN2_Password accessPassword;
  /** A bitmask of bits to lock */
  uint8_t lockBits;
} TMR_TagOp_GEN2_Alien_Higgs3_BlockReadLock;

/** Parameters for NXP, Set Read Protect command */
typedef struct TMR_TagOp_GEN2_NXP_SetReadProtect
{
  /** Access password to use to write to the tag */
  TMR_GEN2_Password accessPassword;
}TMR_TagOp_GEN2_NXP_SetReadProtect;

/** Parameters for NXP, Reset Read Protect Command*/
typedef struct TMR_TagOp_GEN2_NXP_ResetReadProtect
{
  /** Access password to use to write to the tag */
  TMR_GEN2_Password accessPassword;
} TMR_TagOp_GEN2_NXP_ResetReadProtect;

/** Parameters for NXP, Change EAS Command*/
typedef struct TMR_TagOp_GEN2_NXP_ChangeEAS
{
  /** Access password to use to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** Reset or set EAS bit */
  bool reset;
} TMR_TagOp_GEN2_NXP_ChangeEAS;

/** Parameters for NXP, EAS alarm command */
typedef struct TMR_TagOp_GEN2_NXP_EASAlarm
{
  /** Gen2 divide ratio to use */
  TMR_GEN2_DivideRatio dr;
  /** Gen2 M parameter to use */
  TMR_GEN2_TagEncoding m;
  /** Gen2 TrExt value to use */
  TMR_GEN2_TrExt trExt;  
} TMR_TagOp_GEN2_NXP_EASAlarm;

/** Parameters for NXP, Calibration command */
typedef struct TMR_TagOp_GEN2_NXP_Calibrate
{
  /** Access password to use to write to the tag */
  TMR_GEN2_Password accessPassword;
} TMR_TagOp_GEN2_NXP_Calibrate;

/** Parameters for NXP, Change Config command */
typedef struct TMR_TagOp_GEN2_NXP_ChangeConfig
{
  /** Access password to use to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** ConfigWord to write to the tag*/
  TMR_NXP_ConfigWord configWord;
}TMR_TagOp_GEN2_NXP_ChangeConfig;

/** Parameters for NXP, Change Config command */
typedef struct TMR_TagOp_GEN2_Impinj_Monza4_QTReadWrite
{
  /** Access password to use to write to the tag */
  TMR_GEN2_Password accessPassword;
  /** Control Byte to write to the tag*/
  TMR_Monza4_ControlByte controlByte;
  /** Payload */
  TMR_Monza4_Payload payload;    
}TMR_TagOp_GEN2_Impinj_Monza4_QTReadWrite;
 
/** Parameters for IAV, ActivateSecureMode command */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_Activate_Secure_Mode
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_Activate_Secure_Mode;

/** Parameters for IAV, AuthenticateOBU command */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_Authenticate_OBU
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_Authenticate_OBU;

/** Parameters for IAV, Activate_Siniav_Mode command - G0 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_Activate_Siniav_Mode
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
  /* token desc */
  bool isTokenDesc;
  /* 64 bits of token data */
  uint8_t token[8];
}TMR_TagOp_GEN2_Denatran_IAV_Activate_Siniav_Mode;

/** Parameters for IAV, OBU_Auth_ID command - G0 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_ID
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_ID;

/** Parameters for IAV, OBU_Auth_Full_Pass1 command - G0 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass1
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass1;

/** Parameters for IAV,  OBU_Auth_Full_Pass2 command - G0 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass2
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass2;

/** Parameters for IAV,  OBU_ReadFromMemMap command - G0 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_OBU_ReadFromMemMap
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
  /* address to be read from USER bank */
  uint16_t readPtr;
}TMR_TagOp_GEN2_Denatran_IAV_OBU_ReadFromMemMap;

/** Parameters for IAV, read sec  command - IP63 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_Read_Sec
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
  /* address to be read from USER bank */
  uint16_t readPtr;
}TMR_TagOp_GEN2_Denatran_IAV_Read_Sec;

/** Parameters for IAV,  OBU_WriteToMemMap command - G0 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_OBU_WriteToMemMap
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
  /* Pointer to the USER data */
  uint16_t writePtr;
  /* data to be written */
  uint16_t wordData;
  /* Tag ID */
  uint8_t* tagIdentification;
  /* Credentials written word */
  uint8_t* dataBuf;  
}TMR_TagOp_GEN2_Denatran_IAV_OBU_WriteToMemMap;

/** Parameters for IAV,  write sec command - IP63 Protocol */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_Write_Sec
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
  /* data words */
  uint8_t* dataWords;
  /* Credentials written word */
  uint8_t* dataBuf;
}TMR_TagOp_GEN2_Denatran_IAV_Write_Sec;

/** Parameters for IAV, Get Token ID command */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_Get_Token_Id
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
}TMR_TagOp_GEN2_Denatran_IAV_Get_Token_Id;

/** Parameters for IAV, Authenticate OBU Full Pass */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass;

/** Parameters for IAV, G0_PA_OBU_Auth_ID */
typedef struct TMR_TagOp_GEN2_Denatran_IAV_G0_PA_OBU_Auth_ID
{
  /* Enum for IAV tagoperation */
  IAVDenatranSecureTagOpType mode;
  /* RFU field */
  uint8_t payload;
}TMR_TagOp_GEN2_Denatran_IAV_G0_PA_OBU_Auth_ID;

/* Forward declaration for the benefit of TMR_TagOp_List */
typedef struct TMR_TagOp TMR_TagOp;

/** List of tag operations */
typedef struct TMR_TagOp_List
{
  /** Array of pointers to tag operations*/
  TMR_TagOp **list;
  /** Number of tag operations in list */
  uint16_t len;
} TMR_TagOp_List;

/** Sub-class for Gen2 Alien Higgs2 custom tag extensions */
typedef struct TMR_TagOp_GEN2_Alien_Higgs2
{
  union
  {
    TMR_TagOp_GEN2_Alien_Higgs2_PartialLoadImage partialLoadImage;
    TMR_TagOp_GEN2_Alien_Higgs2_FullLoadImage fullLoadImage;
  } u;
}TMR_TagOp_GEN2_Alien_Higgs2;

/** Sub-class for Gen2 Alien Higgs3 custom tag extensions */
typedef struct TMR_TagOp_GEN2_Alien_Higgs3
{
  union
  {
    TMR_TagOp_GEN2_Alien_Higgs3_FastLoadImage fastLoadImage;
    TMR_TagOp_GEN2_Alien_Higgs3_LoadImage loadImage;
    TMR_TagOp_GEN2_Alien_Higgs3_BlockReadLock blockReadLock;
  } u;
}TMR_TagOp_GEN2_Alien_Higgs3;

/** Sub-class for Gen2 Alien custom tag extensions */
typedef struct TMR_TagOp_GEN2_Alien
{
  union
  {
    TMR_TagOp_GEN2_Alien_Higgs2 higgs2;
    TMR_TagOp_GEN2_Alien_Higgs3 higgs3;
  } u;
}TMR_TagOp_GEN2_Alien;

/** Sub-class for Gen2 NXP custom tag extensions */
typedef struct TMR_TagOp_GEN2_NXP
{
  union
  {
    TMR_TagOp_GEN2_NXP_SetReadProtect setReadProtect;
    TMR_TagOp_GEN2_NXP_ResetReadProtect resetReadProtect;
    TMR_TagOp_GEN2_NXP_ChangeEAS changeEAS;
    TMR_TagOp_GEN2_NXP_EASAlarm EASAlarm;
    TMR_TagOp_GEN2_NXP_Calibrate calibrate;
    TMR_TagOp_GEN2_NXP_ChangeConfig changeConfig;
	TMR_TagOp_GEN2_NXP_Untraceable untraceable;
	TMR_TagOp_GEN2_NXP_Authenticate authenticate;
	TMR_TagOp_GEN2_NXP_Readbuffer readBuffer;
  }u;
}TMR_TagOp_GEN2_NXP;

/** Sub-class for Gen2 Impinj Monza4 custom tag extensions */
typedef struct TMR_TagOp_GEN2_Impinj_Monza4
{
  union
  {
    TMR_TagOp_GEN2_Impinj_Monza4_QTReadWrite qtReadWrite;
  } u;
}TMR_TagOp_GEN2_Impinj_Monza4;

/** Sub-class for Gen2 Impinj custom tag extensions */
typedef struct TMR_TagOp_GEN2_Impinj
{
  union
  {
    TMR_TagOp_GEN2_Impinj_Monza4 monza4;
  } u;
}TMR_TagOp_GEN2_Impinj;

/** Sub-class for Gen2 IavDenatran custom tag extensions */
typedef struct TMR_TagOp_GEN2_Denatran
{
  union
  {
    TMR_TagOp_GEN2_Denatran_IAV_Activate_Secure_Mode secureMode;
    TMR_TagOp_GEN2_Denatran_IAV_Authenticate_OBU authenticateOBU;
    TMR_TagOp_GEN2_Denatran_IAV_Activate_Siniav_Mode activateSiniavMode;
    TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_ID obuAuthId;
    TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass1 obuAuthFullPass1;
    TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass2 obuAuthFullPass2;
    TMR_TagOp_GEN2_Denatran_IAV_OBU_ReadFromMemMap obuReadFromMemMap;
    TMR_TagOp_GEN2_Denatran_IAV_OBU_WriteToMemMap obuWriteToMemMap;
    TMR_TagOp_GEN2_Denatran_IAV_Get_Token_Id getTokenId;
    TMR_TagOp_GEN2_Denatran_IAV_Read_Sec readSec;
    TMR_TagOp_GEN2_Denatran_IAV_Write_Sec writeSec;
    TMR_TagOp_GEN2_Denatran_IAV_OBU_Auth_Full_Pass obuAuthFullPass;
    TMR_TagOp_GEN2_Denatran_IAV_G0_PA_OBU_Auth_ID g0paobuauthid;
  } u;
}TMR_TagOp_GEN2_Denatran;

/** Sensor type for IDS Sl900A chip */
typedef enum Sensor
{
  /* SL900A sensor type values */
  TMR_GEN2_IDS_SL900A_SENSOR_TEMP  = 0x00,
  TMR_GEN2_IDS_SL900A_SENSOR_EXT1  = 0x01,
  TMR_GEN2_IDS_SL900A_SENSOR_EXT2  = 0x02,
  TMR_GEN2_IDS_SL900A_SENSOR_BATTV = 0x03,
}Sensor;

/** SL900A password access level values */
typedef enum PasswordLevel
{
  /* No access to any protected area */
  TMR_GEN2_IDS_SL900A_PASSWORD_NOT_ALLOWED = 0x00,
  /* System area access */
  TMR_GEN2_IDS_SL900A_PASSWORD_SYSTEM = 0x01,
  /* Application area access */
  TMR_GEN2_IDS_SL900A_PASSWORD_APPLICATION = 0x02,
  /* Measurement area access */
  TMR_GEN2_IDS_SL900A_PASSWORD_MEASUREMENT = 0x03,
}PasswordLevel;

/** SL900A Data log format selection */
typedef enum LoggingForm
{
  /* Dense Logging */
  TMR_GEN2_IDS_SL900A_LOGGINGFORM_DENSE = 0x00,
  /* Log values outside specified limits */
  TMR_GEN2_IDS_SL900A_LOGGINGFORM_OUTOFLIMITS = 0x01,
  /* Log values at limit crossing points */
  TMR_GEN2_IDS_SL900A_LOGGINGFORM_LIMITSCROSSING = 0x03,
  /* Trigger log on EXT1 input */
  TMR_GEN2_IDS_SL900A_LOGGINGFORM_IRQ1 = 0x05,
  /* Trigger log on EXT2 input */
  TMR_GEN2_IDS_SL900A_LOGGINGFORM_IRQ2 = 0x06,
  /* Trigger log on EXT1 and EXT2 input */
  TMR_GEN2_IDS_SL900A_LOGGINGFORM_IRQ1IRQ2 = 0x07,
}LoggingForm;

/** SL900A Data log memory-full behavior */
typedef enum DelayMode
{
  /* Start logging after delay time */
  TMR_GEN2_IDS_SL900A_DELAYMODE_TIMER = 0x00,
  /* Start logging on external input */
  TMR_GEN2_IDS_SL900A_DELAYMODE_EXTSWITCH = 0x01,
}DelayMode;

/** SL900A Logging memory-full behavior */
typedef enum StorageRule
{
  /* Stop logging when memory fills */
  TMR_GEN2_IDS_SL900A_STORAGERULE_NORMAL = 0x00,
  /*  Roll around (circular buffer) when memory fills */
  TMR_GEN2_IDS_SL900A_STORAGERULE_ROLLING = 0x01,
}StorageRule;

/** Sub-Class for BatterType, re-check or default */
typedef enum BatteryType
{
  /* Default */
  TMR_GEN2_IDS_SL900A_BATTERYTYPE_CHECK = 0x00,
  /* Application requested for the re-check of battery type */
  TMR_GEN2_IDS_SL900A_BATTERYTYPE_RECHECK = 0x01,
}BatteryType;

/** Sub-Class for Raw 9 or 21-bit Get Log State reply */
typedef struct LimitCounter
{
  /* Number of times selected sensor has gone beyond extreme lower limit */
  uint8_t extremeLower;
  /* Number of times selected sensor has gone beyond lower limit */
  uint8_t lower;
  /* Number of times selected sensor has gone beyond upper limit */
  uint8_t upper;
  /* Number of times selected sensor has gone beyond extreme upper limit */
  uint8_t extremeUpper;
}LimitCounter;

/** Sub-Class for  specifying 40 bit LogLimits Value */
typedef struct LogLimits
{
  /* Specifying the extreme lower limit */
  uint16_t extremeLower;
  /* Specifying the lower limit */
  uint16_t lower;
  /* Specifying the upper limit */
  uint16_t upper;
  /* Specifying the extreme upper limit */
  uint16_t extremeUpper;
}LogLimits;

/** Sub-class for SystemStatus reply object */
typedef struct SystemStatus
{
  /* Measurement Address Pointer */
  uint16_t MeasurementAddressPointer;
  /* Number of memory replacements */
  uint8_t NumMemReplacements;
  /* Number of measurements */
  uint16_t NumMeasurements;
  /* Active */
  bool Active;
}SystemStatus;

/** Sub-Class for Log Status Flags */
typedef struct StatusFlags
{
  /* Logging active */
  bool Active;
  /* Measurement area full */
  bool Full;
  /* Measurement overwritten */
  bool Overwritten;
  /* A/D error occurred */
  bool ADError;
  /* Low battery */
  bool LowBattery;
  /* Shelf life low error */
  bool ShelfLifeLow;
  /* Shelf life high error */
  bool ShelfLifeHigh;
  /* ShelfLifeExpired */
  bool ShelfLifeExpired;
}StatusFlags;
/** Sub-class for get log state value reply */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_LogState
{
  /* Number of excursions beyond set limits */
  LimitCounter limitCount;
  /* Logging system status */
  SystemStatus statStatus;
  /* Logging status flags */
  StatusFlags  statFlag;
}TMR_TagOp_GEN2_IDS_SL900A_LogState;

/** Sub-Class for Get Sensor Value reply */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SensorReading
{
  /* Raw 16-bit response from GetSensorValue command */
  uint16_t reply;
  /* Raw sensor reply */
  uint16_t Raw;
  /* Did A/D conversion error occur? */
  bool ADError;
  /* 5-bit Range/Limit value */
  uint8_t RangeLimit;
  /* 10-bit Sensor value */
  uint16_t Value;
}TMR_TagOp_GEN2_IDS_SL900A_SensorReading;

/** Sub-Class for Get Battery Level Reply */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_BatteryLevelReading
{
  /* Raw 16-bit response from GetBatteryLevel command */
  uint16_t reply;
  /* Did A/D conversion error occur? */
  bool ADError;
  /* 1-bit Battery Type */
  uint8_t BatteryType;
  /* 10-bit Battery Level value */
  uint16_t Value;
}TMR_TagOp_GEN2_IDS_SL900A_BatteryLevelReading;

/** Sub-class for  SL900A  Log Mode Data */
typedef struct LogModeData
{
  /* Raw 8-bit response from Measurement Setup Data command */
  uint8_t Raw;
  /* Logging Format */
  LoggingForm Form;
  /* Log Memory-Full Behavior */
  StorageRule Storage;
  /* Enable log for EXT1 external sensor */
  bool Ext1Enable;
  /* Enable log for EXT2 external sensor */
  bool Ext2Enable;
  /* Enable log for temperature sensor */
  bool TempEnable;
  /* Enable log for battery sensor */
  bool BattEnable;
}LogModeData;

/** Sub-class for Calibration Data */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_CalibrationData
{
  /* Raw 56-bit Calibration data value */
  uint64_t raw;
  /* AD1 lower voltage reference - fine - DO NOT MODIFY */
  uint8_t Ad1;
  /* AD1 lower voltage reference - coarse */
  uint8_t Coarse1;
  /* AD2 lower voltage reference - fine - DO NOT MODIFY */
  uint8_t Ad2;
  /* AD2 lower voltage reference - coarse */
  uint8_t Coarse2;
  /* Switches the lower AD voltage reference to ground */
  bool GndSwitch;
  /* POR voltage level for 1.5V system */
  uint8_t Selp12;
  /* Main reference voltage calibration -- DO NOT MODIFY */
  uint8_t Adf;
  /* RTC oscillator calibration */
  uint8_t Df;
  /* Controlled battery supply for external sensor - the battery voltage is connected to the EXC pin */
  bool SwExtEn;
  /* POR voltage level for 3V system */
  uint8_t Selp22;
  /* Voltage level interrupt level for external sensor -- ratiometric */
  uint8_t Irlev;
  /* Main system clock oscillator calibration -- DO NOT MODIFY */
  uint8_t RingCal;
  /* Temperature conversion offset calibration -- DO NOT MODIFY */
  uint8_t  OffInt;
  /* Bandgap voltage temperature coefficient calibration -- DO NOT MODIFY */
  uint8_t Reftc;
  /* Excitate for resistive sensors without DC */
  bool ExcRes;
  /*  Reserved for Future Use */
  uint8_t RFU;
  /* Specifyes the field user can modify */
  CalibrationParameter type;
}TMR_TagOp_GEN2_IDS_SL900A_CalibrationData;

/** Sub-class to specify Sensor Front End Parameters */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SfeParameters
{
  /*  Raw 16-bit SFE parameters value */
  uint16_t raw;
  /* External sensor 2 range */
  uint8_t Rang;
  /* External sensor 1 range */
  uint8_t Seti;
  /** 
   * External sensor 1 type
   * 00 -- linear resistive sensor
   * 01 -- high impedance input (voltage follower), bridge
   * 10 -- capacitive sensor with DC
   * 11 -- capacitive or resistive sensor without DC
   */
  uint8_t Ext1;
  /**
   * External sensor 2 type
   * 00 -- linear conductive sensor
   * 01 -- high impedance input (voltage follower), bridge
   */
  uint8_t Ext2;
  /* Use preset range */
  bool AutorangeDisable;
  /**
   * Sensor used in limit check
   * 00 - first selected sensor
   * 01 -- second selected sensor
   * 10 -- third selected sensor
   * 11 -- fourth selected sensor
   */
  uint8_t VerifySensorID;
  /* specifies the type of field user want to modufy */
  SfeParameter type;
}TMR_TagOp_GEN2_IDS_SL900A_SfeParameters;

/** Sub-Class to Combination Calibration Data / SFE Parameters object */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_CalSfe
{
  /* Calibration Data */
  TMR_TagOp_GEN2_IDS_SL900A_CalibrationData Cal;
  /* Sensor Front End Parameters */
  TMR_TagOp_GEN2_IDS_SL900A_SfeParameters Sfe;
}TMR_TagOp_GEN2_IDS_SL900A_CalSfe;

/**Sub-Class to spcify fifo source */
typedef enum FifoSource
{
  /* Data from SPI */
  TMR_GEN2_IDS_SL900A_FIFOSOURCE_SPI = 0x00,
  /* Data from RFID */
  TMR_GEN2_IDS_SL900A_FIFOSOURCE_RFID = 0x01,
}FifoSource;
/** Sub-Class for Get status fifo reply */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_FifoStatus
{
  /* Raw 8-bit response from AccessFifo Status command */
  uint8_t raw;
  /* FIFO Busy bit */
  bool fifoBusy;
  /* Data Ready bit */
  bool dataReady;
  /* No Data bit */
  bool noData;
  /* Data Source bit (SPI, RFID) */
  FifoSource source;
  /* Number of valid bytes in FIFO register */
  uint8_t numValidBytes;
}TMR_TagOp_GEN2_IDS_SL900A_FifoStatus;

/** Sub-Class for specifying SL900A application data */
typedef struct ApplicationData
{
  /* Raw 16-bit protocol value */
  uint16_t raw;
  /* Number of user bank memory words to reserve for non-logging purposes */
  uint16_t NumberOfWords;
  /* Broken word pointer */
  uint8_t BrokenWordPointer;
}ApplicationData;

/** Sub-Class for Gen2 Ids Sl900A coustom tag extension */
typedef struct TMR_TagOP_GEN2_IDS_SL900A
{
  /* SL900A sensor type values */
  Sensor sensortype;
  /* SL900A password access level values */
  PasswordLevel level;
  /* Data log format selection */
  LoggingForm dataLog;
  /* Data log memory-full behavior */
  DelayMode mode;
  /* Logging memory-full behavior */
  StorageRule rule;
}TMR_TagOP_GEN2_IDS_SL900A;

/** Sub- class for Ids Sl900A sensor */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_GetSensorValue
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
}TMR_TagOp_GEN2_IDS_SL900A_GetSensorValue;

/** Sub-class for IDs SL900A get log state */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_GetLogState
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
}TMR_TagOp_GEN2_IDS_SL900A_GetLogState;

/** Sub-Class for IDS SL900A set log mode */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SetLogMode
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /*Enable log for EXT1 external sensor */
  bool Ext1Enable;
  /* Enable log for EXT2 external sensor */
  bool Ext2Enable;
  /* Enable log for temperature sensor */
  bool TempEnable;
  /* Enable log for battery sensor */
  bool BattEnable;
  /* Time (seconds) between log readings */
  uint16_t LogInterval;
}TMR_TagOp_GEN2_IDS_SL900A_SetLogMode;

/** Sub-Class for Gen2 end log command*/
typedef struct TMR_TagOp_GEN2_IDS_SL900A_EndLog
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
}TMR_TagOp_GEN2_IDS_SL900A_EndLog;

/** Sub-Class for DelayTime */
typedef struct Delay
{
  /* Raw 16-bit protocol value */
  uint16_t raw;
  /* Logging start mode */
  DelayMode Mode;
  /* Logging timer delay value (units of 512 seconds) */
  uint16_t Time;
  /* Trigger log on both timer and external interrupts */
  bool IrqTimerEnable;
}Delay;

/** Sub-Classs for ShelfLife Block 0 */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock0
{
  /* raw value of block0 */
  uint32_t raw;
  /* Tmax */
  uint8_t Tmax;
  /* Tmin */
  uint8_t Tmin;
  /* Tstd */
  uint8_t Tstd;
  /* Ea */
  uint8_t Ea;
}TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock0;

/** Sub-Class for ShelfLife Block 1 */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock1
{
  /* raw value for block 1 */
  uint32_t raw;
  /* SLinit */
  uint16_t SLinit;
  /* Tint */
  uint16_t Tint;
  /* SensorID */
  uint8_t sensorID;
  /* Enable negative shelf life */
  bool enableNegative;
  /* Shelf life algorithem enable */
  bool algorithmEnable;
  /* RFU bytes */
  uint8_t rfu;
}TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock1;

/** Sub-class for GetMeasurmentSetUp command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_MeasurementSetupData
{
  /* Raw 16 byte response from Measurement Setup Data command */
  uint8_t Raw[16];
  /* LogLimits Data */
  LogLimits loglimit;
  /* Log Mode Data */
  LogModeData logModeData;
  /* Delay Data */
  Delay delyTime;
  /* Application Data */
  ApplicationData addData;
  /* Time (seconds) between log readings */
  uint16_t logInterval;
  /* Start Time */
  TMR_TimeStructure startTime;
}TMR_TagOp_GEN2_IDS_SL900A_MeasurementSetupData;

/** Sub-Class for GEN2 initialize command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_Initialize
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Logging memory configuration */
  ApplicationData applicationData;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* Delay time */
  Delay delayTime;
}TMR_TagOp_GEN2_IDS_SL900A_Initialize;

/** Sub-Class for specifying AccessFifo operation */
typedef enum AccessFifoOperation
{
  /* Read from FIFO */
  TMR_GEN2_IDS_SL900A_ACCESSFIFO_READ = 0x80,
  /* Write to FIFO */
  TMR_GEN2_IDS_SL900A_ACCESSFIFO_WRITE = 0xA0,
  /* Get FIFO status */
  TMR_GEN2_IDS_SL900A_ACCESSFIFO_STATUS = 0xC0,
}AccessFifoOperation;

/** Sub-Class for Gen2 Ids AccessFifo command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_AccessFifo
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* specify the operation do be done on fifo */
  AccessFifoOperation operation;
}TMR_TagOp_GEN2_IDS_SL900A_AccessFifo;

/** Sub-Class for Gen2 Ids accessFifo write command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_AccessFifoWrite
{
  TMR_TagOp_GEN2_IDS_SL900A_AccessFifo write;
  /* Bytes to write to FIFO */
  TMR_uint8List *payLoad;
}TMR_TagOp_GEN2_IDS_SL900A_AccessFifoWrite;

/** Sub-Class for Gen2 Ids accessFifo read command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_AccessFifoRead
{
  TMR_TagOp_GEN2_IDS_SL900A_AccessFifo read;
  /* Number of bytes to read from FIFO */
  uint8_t length;
}TMR_TagOp_GEN2_IDS_SL900A_AccessFifoRead;

/** Sub-Class for Gen2 Ids accessFifo status command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_AccessFifoStatus
{
  TMR_TagOp_GEN2_IDS_SL900A_AccessFifo status;
}TMR_TagOp_GEN2_IDS_SL900A_AccessFifoStatus;

/** Sub-Class for Gen2 StartLog command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_StartLog
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* Time to initialize log timestamp counter with */
  uint32_t startTime;  
}TMR_TagOp_GEN2_IDS_SL900A_StartLog;

/** Sub-Class for Gen2 IDS GetCalibrationData command */
typedef struct  TMR_TagOp_GEN2_IDS_SL900A_GetCalibrationData
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
}TMR_TagOp_GEN2_IDS_SL900A_GetCalibrationData;

/** Sub-Class for Gen2 IDS SetCalibrationData command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SetCalibrationData
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* Calibration parameters */
  TMR_TagOp_GEN2_IDS_SL900A_CalibrationData cal; 
}TMR_TagOp_GEN2_IDS_SL900A_SetCalibrationData;

/** Sub-class for Gen2 Ids SetSfeParameters command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SetSfeParameters
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* Sfe Parameters */
  TMR_TagOp_GEN2_IDS_SL900A_SfeParameters *sfe;
}TMR_TagOp_GEN2_IDS_SL900A_SetSfeParameters;

/** Sub-class for Gen2 Ids GetMeasurementSetup command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_GetMeasurementSetup
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
}TMR_TagOp_GEN2_IDS_SL900A_GetMeasurementSetup;

/** Sub-class for Gen2 Ids GetBatteryLevel command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_GetBatteryLevel
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* enum BatterType, re-check or default */
  BatteryType batteryType;
}TMR_TagOp_GEN2_IDS_SL900A_GetBatteryLevel;

/** Sub-Class for Gen2 Ids SetLogLimits Command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SetLogLimits
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* Specify the Log Limits */
  LogLimits limit;
}TMR_TagOp_GEN2_IDS_SL900A_SetLogLimits;

/** Sub-Class for Gen2 Ids SetShelfLife Command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SetShelfLife
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* Specify the ShelfLifeBlock0 */
  TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock0 *shelfLifeBlock0;
  /* Specify the ShelfLifeBlock1 */
  TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock1 *shelfLifeBlock1;
}TMR_TagOp_GEN2_IDS_SL900A_SetShelfLife;

/** Sub-Class for Gen2 Ids SetPassword Command */
typedef struct TMR_TagOp_GEN2_IDS_SL900A_SetPassword
{
  TMR_TagOP_GEN2_IDS_SL900A sl900A;
  /* Custom Command Code */
  uint8_t CommandCode;
  /* Gen2 access password */
  uint32_t AccessPassword;
  /* IDS SL900A Password */
  uint32_t Password;
  /* New Passwordlevel */
  PasswordLevel NewPasswordLevel;
  /* New password */
  uint32_t NewPassword;
}TMR_TagOp_GEN2_IDS_SL900A_SetPassword;

/** Sub-class for Gen2 Ids parameters */
typedef struct TMR_TagOP_GEN2_IDS
{
  union
  {
    TMR_TagOp_GEN2_IDS_SL900A_GetSensorValue sensor;
    TMR_TagOp_GEN2_IDS_SL900A_GetLogState  getLog;
    TMR_TagOp_GEN2_IDS_SL900A_SetLogMode   setLogMode;
    TMR_TagOp_GEN2_IDS_SL900A_EndLog endLog;
    TMR_TagOp_GEN2_IDS_SL900A_Initialize initialize;
    TMR_TagOp_GEN2_IDS_SL900A_AccessFifoRead accessFifoRead;
    TMR_TagOp_GEN2_IDS_SL900A_AccessFifoWrite accessFifoWrite;
    TMR_TagOp_GEN2_IDS_SL900A_AccessFifoStatus accessFifoStatus;
    TMR_TagOp_GEN2_IDS_SL900A_StartLog startLog;
    TMR_TagOp_GEN2_IDS_SL900A_GetCalibrationData calibrationData;
    TMR_TagOp_GEN2_IDS_SL900A_SetCalibrationData setCalibration;
    TMR_TagOp_GEN2_IDS_SL900A_SetSfeParameters setSfeParameters;
    TMR_TagOp_GEN2_IDS_SL900A_GetMeasurementSetup measurementSetup;
    TMR_TagOp_GEN2_IDS_SL900A_GetBatteryLevel batteryLevel;
    TMR_TagOp_GEN2_IDS_SL900A_SetLogLimits setLogLimit;
    TMR_TagOp_GEN2_IDS_SL900A_SetShelfLife setShelfLife;
    TMR_TagOp_GEN2_IDS_SL900A_SetPassword setPassword;
    
  }u;
}TMR_TagOP_GEN2_IDS;
/** Sub-class for Gen2 custom tagops */
typedef struct TMR_TagOp_GEN2_Custom
{
  TMR_SR_GEN2_SiliconType chipType;
  union
  {
    TMR_TagOp_GEN2_Alien alien;
    TMR_TagOp_GEN2_NXP nxp;
    TMR_TagOp_GEN2_Impinj impinj;
    TMR_TagOP_GEN2_IDS ids;
    TMR_TagOp_GEN2_Denatran IavDenatran;
  } u;
}TMR_TagOp_GEN2_Custom;

/** Sub-class for ISO180006B tagops */
typedef struct TMR_TagOp_ISO180006B
{
  union
  {
    TMR_TagOp_ISO180006B_Lock lock;
    TMR_TagOp_ISO180006B_WriteData writeData;
    TMR_TagOp_ISO180006B_ReadData readData;
  } u;
}TMR_TagOp_ISO180006B;

/** Sub-class for Gen2 standard tagops */
typedef struct TMR_TagOp_GEN2
{
  union
  {
    TMR_TagOp_GEN2_WriteTag writeTag;
    TMR_TagOp_GEN2_WriteData writeData;
    TMR_TagOp_GEN2_ReadData readData;
    TMR_TagOp_GEN2_SecureReadData secureReadData;
    TMR_TagOp_GEN2_Lock lock;
    TMR_TagOp_GEN2_Kill kill;
    TMR_TagOp_GEN2_BlockWrite blockWrite;
    TMR_TagOp_GEN2_BlockPermaLock blockPermaLock;
    TMR_TagOp_GEN2_BlockErase blockErase;
    TMR_TagOp_GEN2_Custom custom;
  } u;
}TMR_TagOp_GEN2;

/** Tag operation data structure */
struct TMR_TagOp
{
  TMR_TagOpType type;
  union
  {
    TMR_TagOp_GEN2 gen2;
    TMR_TagOp_ISO180006B iso180006b;
    TMR_TagOp_List list;
  } u;
};

TMR_Status TMR_TagOp_init_GEN2_WriteTag(TMR_TagOp *tagop, TMR_TagData* epc);
TMR_Status TMR_TagOp_init_GEN2_ReadData(TMR_TagOp *tagop, TMR_GEN2_Bank bank,
                                        uint32_t wordAddress, uint8_t len);
TMR_Status TMR_TagOp_init_GEN2_SecureReadData(TMR_TagOp *tagop, TMR_GEN2_Bank bank, uint32_t wordAddress,
                                               uint8_t len, uint8_t type, uint8_t passwordType);
TMR_Status TMR_TagOp_init_GEN2_SecurePassWord(TMR_TagOp *tagop, uint8_t passwordType, uint32_t gen2PassWord,
                                              uint8_t addressLength, uint8_t addressOffset, uint16_t flashOffset);
TMR_Status TMR_TagOp_init_GEN2_WriteData(TMR_TagOp *tagop, TMR_GEN2_Bank bank,
                                         uint32_t wordAddress,
                                         TMR_uint16List *data);
TMR_Status TMR_TagOp_init_GEN2_Lock(TMR_TagOp *tagop, uint16_t mask,
                                    uint16_t action,  TMR_GEN2_Password accessPassword);
TMR_Status TMR_TagOp_init_GEN2_Kill(TMR_TagOp *tagop,
                                    TMR_GEN2_Password killPassword);
TMR_Status TMR_TagOp_init_GEN2_BlockWrite(TMR_TagOp *tagop, TMR_GEN2_Bank bank, uint32_t wordPtr, TMR_uint16List *data);
TMR_Status TMR_TagOp_init_GEN2_BlockPermaLock(TMR_TagOp *tagop, uint8_t readLock, TMR_GEN2_Bank bank, uint32_t blockPtr, TMR_uint16List* mask);
TMR_Status TMR_TagOp_init_GEN2_BlockErase(TMR_TagOp *tagop, TMR_GEN2_Bank bank, uint32_t wordPtr, uint8_t wordCount);

TMR_Status TMR_TagOp_init_ISO180006B_ReadData(TMR_TagOp *tagop, uint8_t byteAddress, uint8_t len);
TMR_Status TMR_TagOp_init_ISO180006B_WriteData(TMR_TagOp *tagop, uint8_t byteAddress, TMR_uint8List *data);
TMR_Status TMR_TagOp_init_ISO180006B_Lock(TMR_TagOp *tagop, uint8_t address);
TMR_Status TMR_TagOp_init_GEN2_Alien_Higgs2_PartialLoadImage(TMR_TagOp *tagop, TMR_GEN2_Password killPassword,
                                                  TMR_GEN2_Password accessPassword, TMR_TagData *epc);
TMR_Status TMR_TagOp_init_GEN2_Alien_Higgs2_FullLoadImage(TMR_TagOp *tagop, TMR_GEN2_Password killPassword,
                                    TMR_GEN2_Password accessPassword, uint16_t lockBits, 
                                    uint16_t pcWord, TMR_TagData *epc);
TMR_Status TMR_TagOp_init_GEN2_Alien_Higgs3_FastLoadImage(TMR_TagOp *tagop, TMR_GEN2_Password currentAccessPassword,
                                    TMR_GEN2_Password accessPassword, TMR_GEN2_Password killPassword, 
                                    uint16_t pcWord, TMR_TagData *epc);
TMR_Status TMR_TagOp_init_GEN2_Alien_Higgs3_LoadImage(TMR_TagOp *tagop, TMR_GEN2_Password currentAccessPassword,
                                    TMR_GEN2_Password accessPassword, TMR_GEN2_Password killPassword, 
                                    uint16_t pcWord, TMR_uint8List *epcAndUserData);
TMR_Status TMR_TagOp_init_GEN2_Alien_Higgs3_BlockReadLock(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, uint8_t lockBits);

TMR_Status TMR_TagOp_init_GEN2_NXP_G2I_SetReadProtect(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword);
TMR_Status TMR_TagOp_init_GEN2_NXP_G2X_SetReadProtect(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword);

TMR_Status TMR_TagOp_init_GEN2_NXP_G2I_ResetReadProtect(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword);
TMR_Status TMR_TagOp_init_GEN2_NXP_G2X_ResetReadProtect(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword);

TMR_Status TMR_TagOp_init_GEN2_NXP_G2I_ChangeEAS(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, bool resetEAS);
TMR_Status TMR_TagOp_init_GEN2_NXP_G2X_ChangeEAS(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, bool resetEAS);

TMR_Status TMR_TagOp_init_GEN2_NXP_G2I_EASAlarm(TMR_TagOp *tagop, TMR_GEN2_DivideRatio dr, TMR_GEN2_TagEncoding m, TMR_GEN2_TrExt trExt);
TMR_Status TMR_TagOp_init_GEN2_NXP_G2X_EASAlarm(TMR_TagOp *tagop, TMR_GEN2_DivideRatio dr, TMR_GEN2_TagEncoding m, TMR_GEN2_TrExt trExt);

TMR_Status TMR_TagOp_init_GEN2_NXP_G2I_Calibrate(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword);
TMR_Status TMR_TagOp_init_GEN2_NXP_G2X_Calibrate(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword);

TMR_Status TMR_TagOp_init_GEN2_NXP_G2I_ChangeConfig(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, TMR_NXP_ConfigWord configWord);
TMR_Status TMR_TagOp_init_GEN2_NXP_G2X_ChangeConfig(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, TMR_NXP_ConfigWord configWord);
TMR_Status TMR_TagOp_init_GEN2_NXP_AES_Untraceable(TMR_TagOp *tagop,TMR_GEN2_UNTRACEABLE_Epc epc, int epclen , TMR_GEN2_UNTRACEABLE_Tid tid,
				    TMR_GEN2_UNTRACEABLE_UserMemory user, TMR_GEN2_UNTRACEABLE_Range range, TMR_TagOp_GEN2_NXP_Untraceable *auth);
TMR_Status TMR_TagOp_init_GEN2_NXP_AES_Authenticate(TMR_TagOp *tagop, TMR_TagOp_GEN2_NXP_Authenticate *authenticate);
TMR_Status TMR_TagOp_init_GEN2_NXP_AES_ReadBuffer(TMR_TagOp *tagop, uint16_t wordPointer, uint16_t bitCount, TMR_TagOp_GEN2_NXP_Readbuffer *readbuffer);
TMR_Status TMR_TagOp_init_GEN2_NXP_AES_Tam1authentication(TMR_TagOp_GEN2_NXP_Tam1Authentication *auth, TMR_NXP_KeyId keyid, TMR_uint8List *key, 
					TMR_uint8List *ichallenge ,bool sendRawData );
TMR_Status TMR_TagOp_init_GEN2_NXP_AES_Tam2authentication(TMR_TagOp_GEN2_NXP_Tam2Authentication *auth, TMR_NXP_KeyId keyid, TMR_uint8List *key, 
					TMR_uint8List *ichallenge, TMR_NXP_Profile profile, uint16_t Offset,uint8_t blockCount,bool sendRawData);

TMR_Status TMR_TagOp_init_GEN2_Impinj_Monza4_QTReadWrite(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                             TMR_Monza4_ControlByte controlByte, TMR_Monza4_Payload payload);

TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_Activate_Secure_Mode(TMR_TagOp *tagop, uint8_t rfuByte);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_Authenticate_OBU(TMR_TagOp *tagop, uint8_t rfuByte);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_Activate_Siniav_Mode(TMR_TagOp *tagop, uint8_t rfuByte, TMR_uint8List *data);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_OBU_Auth_ID(TMR_TagOp *tagop, uint8_t rfuByte);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_OBU_Auth_Full_Pass1(TMR_TagOp *tagop, uint8_t rfuByte);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_OBU_Auth_Full_Pass2(TMR_TagOp *tagop, uint8_t rfuByte);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_OBU_ReadFromMemMap(TMR_TagOp *tagop, uint8_t rfuByte, uint16_t wordAddress);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_OBU_WriteToMemMap(TMR_TagOp *tagop, uint8_t rfuByte, uint16_t wordAddress, uint16_t word, uint8_t* tagID, uint8_t* data);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_GetTokenId(TMR_TagOp *tagop);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_OBU_Auth_Full_Pass(TMR_TagOp *tagop, uint8_t payload);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_ReadSec(TMR_TagOp *tagop, uint8_t payload, uint16_t wordAddress);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_WriteSec(TMR_TagOp *tagop, uint8_t payload, uint8_t* data, uint8_t* credentials);
TMR_Status TMR_TagOp_init_GEN2_Denatran_IAV_G0_PA_OBU_Auth(TMR_TagOp *tagop, uint8_t rfuByte);

TMR_Status 
TMR_init_GEN2_NXP_G2I_ConfigWord(TMR_NXP_ConfigWord *configWord);

TMR_Status
TMR_init_GEN2_Impinj_Monza4_ControlByte(TMR_Monza4_ControlByte *controlByte);

TMR_Status
TMR_init_GEN2_Impinj_Monza4_Payload(TMR_Monza4_Payload *payload);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_GetSensorValue(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                              PasswordLevel level, uint32_t password, Sensor type);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_GetCalibrationData(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                                  PasswordLevel leveli, uint32_t password);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_SetLogLimit(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, 
                                           PasswordLevel level, uint32_t password, LogLimits *logLimits);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_SetCalibrationData(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level, 
                                                  uint32_t password, TMR_TagOp_GEN2_IDS_SL900A_CalibrationData *data);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_SetSfeParameters(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level, 
                                                uint32_t password, TMR_TagOp_GEN2_IDS_SL900A_SfeParameters *data);
TMR_Status
TMR_init_GEN2_IDS_SL900A_SensorReading(TMR_uint8List *reply, TMR_TagOp_GEN2_IDS_SL900A_SensorReading *sensor);

TMR_Status
TMR_init_GEN2_IDS_SL900A_BatteryLevelReading(TMR_uint8List *reply, TMR_TagOp_GEN2_IDS_SL900A_BatteryLevelReading *battery);

TMR_Status
TMR_init_GEN2_IDS_SL900A_MeasurementSetupData(TMR_uint8List *reply, TMR_TagOp_GEN2_IDS_SL900A_MeasurementSetupData *measurment);

TMR_Status
TMR_init_GEN2_IDS_SL900A_CalSfe(TMR_uint8List *reply, TMR_TagOp_GEN2_IDS_SL900A_CalSfe *calSfe);

TMR_Status
TMR_init_GEN2_IDS_SL900A_CalibrationData(uint8_t byte[7], TMR_TagOp_GEN2_IDS_SL900A_CalibrationData *cal);

TMR_Status
TMR_update_GEN2_IDS_SL900A_CalibrationData(TMR_TagOp_GEN2_IDS_SL900A_CalibrationData *cal);

TMR_Status
TMR_update_GEN2_IDS_SL900A_SfeParameters(TMR_TagOp_GEN2_IDS_SL900A_SfeParameters *sfe);

TMR_Status
TMR_init_GEN2_IDS_SL900A_SfeParameters(uint8_t byte[2], TMR_TagOp_GEN2_IDS_SL900A_SfeParameters *sfe);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_GetLogState(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                           PasswordLevel level, uint32_t password);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_SetLogMode(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level,
                                          uint32_t password, LoggingForm form, StorageRule rule, bool Ext1Enable,
                                          bool Ext2Enable, bool TempEnable, bool BattEnable, uint16_t LogInterval);

TMR_Status
TMR_init_GEN2_IDS_SL900A_LogState(TMR_uint8List *reply, TMR_TagOp_GEN2_IDS_SL900A_LogState *log);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_Initialize(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level,
                                          uint32_t password, uint8_t delayMode, uint16_t delayTime, bool timeEnable,
                                          uint16_t numberOfWords, uint8_t BrokenWordPointer);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_EndLog(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                      PasswordLevel level, uint32_t password);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_AccessFifoStatus(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                                PasswordLevel level ,uint32_t password);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_AccessFifoRead(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level,
                                              uint32_t password,  uint8_t readLength);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_AccessFifoWrite(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                               PasswordLevel level, uint32_t password, TMR_uint8List *payLoad);
TMR_Status
TMR_init_GEN2_IDS_SL900A_FifoStatus(TMR_uint8List *reply, TMR_TagOp_GEN2_IDS_SL900A_FifoStatus *status);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_StartLog(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                        PasswordLevel level, uint32_t password, TMR_TimeStructure *timestamp);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_GetMeasurementSetup(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                                   PasswordLevel level, uint32_t password);

TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_SetPassword(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level,
                                           uint32_t password, PasswordLevel newPasswordLevel, uint32_t newPassword);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_GetBatteryLevel(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword,
                                               PasswordLevel level, uint32_t password, BatteryType type);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_ShelfLifeBlock0(TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock0 *block0,
                                               uint8_t tmax, uint8_t Tmin, uint8_t tstd, uint8_t Ea);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_ShelfLifeBlock1(TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock1 *block1,
                                               uint16_t slinit, uint16_t tint, uint8_t sensorid,
                                               bool negative, bool algorithm);
TMR_Status
TMR_TagOp_init_GEN2_IDS_SL900A_SetShelfLife(TMR_TagOp *tagop, TMR_GEN2_Password accessPassword, PasswordLevel level,
                                            uint32_t password, TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock0 *block0,
                                            TMR_TagOp_GEN2_IDS_SL900A_ShelfLifeBlock1 *block1);
TMR_Status
TMR_GEN2_init_BapParams(TMR_GEN2_Bap *bapVal, int32_t powerUpDelayUs, int32_t freqHopOfftimeUs);
#ifdef __cplusplus
}
#endif

#endif /* _TMR_TAGOP_H */