⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rfidradio.cpp

📁 UHF RFID Reader Program
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "MainFrm.h"

#include "RFRMDoc.h"
#include "RFRMView.h"

#include "RFIDRadio.h"
#include "RFIDRadioManager.h"

//static CWnd* pWnd;
static CRFIDRadioManager* parent;

CRFIDRadio::CRFIDRadio(RFID_RADIO_INFO* pRadioInfo, void* pParent)
: AThread()
, m_bEmulated(FALSE)
, m_pRadioInfo(pRadioInfo)
, m_rfidIndentlevel(0)
, m_runStatus(RFID_INVENTORY)
, m_nStopCountDown(-1)
, m_bPerformSelectOpsFlag(FALSE)
, m_bPerformPostMatchFlag(FALSE)
, m_epc(NULL)
{
//	if(pParent->GetSafeHwnd() != NULL)
//		pWnd = pParent;
	
	parent = static_cast<CRFIDRadioManager*>(pParent);
}

CRFIDRadio::~CRFIDRadio(void)
{
}

RFID_STATUS CRFIDRadio::OpenRadio()
{
	RFID_STATUS result;

	/* Open the radio */
	if (RFID_STATUS_OK !=
		(result =
		RFID_RadioOpen(m_pRadioInfo->cookie, &m_rfidHandle, 
		m_bEmulated ? RFID_FLAG_MAC_EMULATION : 0)))
	{
		TRACE1("RFID_RadioOpen failed:  RC = %d\n", result);
		return result;
	}

	// Load Operation Mode data
	if(RFID_STATUS_OK !=
		( result = m_objectOperationMode.Load(this)))
	{
		TRACE1("Load Operation Mode failed:  RC = %d\n", result);
		return result;
	}

//	SetRadioOperationMode(RFID_RADIO_OPERATION_MODE_NONCONTINUOUS);
	SetRadioTransferTime(0);
//	SetRadioResponseDataMode(RFID_RESPONSE_MODE_COMPACT);
/*
	switch (GetSystemDefaultUILanguage()) 
	{ 
	case 0x0412: 
		{
			SetMacRegion(RFID_MAC_REGION_KOREA_FHSS);
			break; 
		}
	case 0x0409: 
		{
			SetMacRegion(RFID_MAC_REGION_FCC_GENERIC);
			break; 
		}
	case 0x0411: 
		{
			SetMacRegion(RFID_MAC_REGION_JAPAN_GENERIC);
			break; 
		}
	default:
		break;
	}
*/
	return result;
}

RFID_STATUS CRFIDRadio::CloseRadio()
{
	RFID_STATUS   status = RFID_STATUS_OK;

	if(m_rfidHandle)
	{
		if( RFID_STATUS_OK != 
			(status = RFID_MacClearError(m_rfidHandle)))
		{
			TRACE1("RFID_MacClearError failed: RC = %d\n",status);
			return status;
		}

		if( RFID_STATUS_OK != 
			(status = RFID_RadioClose(m_rfidHandle)))
		{
			TRACE1("RFID_RadioClose failed: RC = %d\n",status);
			return status;
		}
	}

	return status;
}

CString ByteArrayToCString(
	const INT8U *bytes,
	int length
	)
{
	int index;
	CString stemp, str; 
	str = "";

	for (index = 0; index < length; ++index)
	{
		stemp.Format(_T("%s%.2x"), (index && !(index % 4)) ? _T(" ") : _T(""), bytes[index]);
		//        sprintf((LPSTR)(LPCTSTR)temp, "%s%.2x", (index && !(index % 4)) ? _T(" ") : _T(""), bytes[index]);

		str += stemp;
	}

	return str;
}

void PrintPacket(const INT8U *packet, int indent)
{
	RFID_PACKET_COMMON *common = (RFID_PACKET_COMMON *)packet;
	INT16U packetType = MacToHost16(common->pkt_type);

	switch (packetType)
	{
	case RFID_PACKET_TYPE_COMMAND_BEGIN:
		{
			RFID_PACKET_COMMAND_BEGIN *cmdbegin =
				(RFID_PACKET_COMMAND_BEGIN *)packet;
			INT32U command = MacToHost32(cmdbegin->command);

			TRACE(_T("Packet type: RFID_PACKET_COMMAND_BEGIN\n"));
			CString temp;
			if(common->flags & 1)
				temp.Format(_T(""));
			else
				temp.Format(_T("%s"), "not");
			TRACE(_T("  Operation was %s executed in continuous mode\n"), temp);
			TRACE(_T("  Operation started at millisecond %u\n"), MacToHost32(cmdbegin->ms_ctr));
			TRACE(_T("  Operation that is beginning: "));
			switch (command)
			{
			case RFID_COMMAND_TYPE_18K6C_INVENTORY:
				TRACE(_T("Inventory\n"));
				break;
			case RFID_COMMAND_TYPE_18K6C_READ:
				TRACE(_T("Read\n"));
				break;
			case RFID_COMMAND_TYPE_18K6C_WRITE:
				TRACE(_T("Write\n"));
				break;
			case RFID_COMMAND_TYPE_18K6C_LOCK:
				TRACE(_T("Lock\n"));
				break;
			case RFID_COMMAND_TYPE_18K6C_KILL:
				TRACE(_T("Kill\n"));
				break;
			default:
				TRACE(_T("Unknown (%u)\n"), command);
				break;
			}
			break;
		}
	case RFID_PACKET_TYPE_COMMAND_END:
		{
			CString temp;
			RFID_PACKET_COMMAND_END *cmdend = (RFID_PACKET_COMMAND_END *)packet;
			
			TRACE(_T("Packet type: RFID_PACKET_COMMAND_END\n"));
			TRACE(_T("Operation ended at millisecond %u\n"), MacToHost32(cmdend->ms_ctr));

			if(cmdend->status)
				temp.Format(_T("Failed %s"), MacToHost32(cmdend->status));
			else
				temp.Format(_T("Succeeded"));

			TRACE(_T("Operation status: %u (%s)\n"), MacToHost32(cmdend->status), temp);

			break;
		}
	case RFID_PACKET_TYPE_ANTENNA_CYCLE_BEGIN:
		TRACE(_T("Packet type: RFID_PACKET_ANTENNA_CYCLE_BEGIN\n"));
		break;
	case RFID_PACKET_TYPE_ANTENNA_CYCLE_END:
		TRACE(_T("Packet type: RFID_PACKET_ANTENNA_CYCLE_END\n"));
		break;
	case RFID_PACKET_TYPE_ANTENNA_BEGIN:
		{
			RFID_PACKET_ANTENNA_BEGIN *antennabegin = (RFID_PACKET_ANTENNA_BEGIN *)packet;
			TRACE(_T("Packet type: RFID_PACKET_ANTENNA_BEGIN\n"));
			TRACE(_T("Antenna ID: %u\n"), MacToHost32(antennabegin->antenna));

			break;
		}
	case RFID_PACKET_TYPE_ANTENNA_END:
		TRACE(_T("Packet type: RFID_PACKET_ANTENNA_END\n"));
		break;
	case RFID_PACKET_TYPE_INVENTORY_CYCLE_BEGIN:
		TRACE(_T("Packet type: RFID_PACKET_INVENTORY_CYCLE_BEGIN\n"));
		break;
	case RFID_PACKET_TYPE_INVENTORY_CYCLE_END:
		TRACE(_T("Packet type: RFID_PACKET_INVENTORY_CYCLE_END\n"));
		break;
	case RFID_PACKET_TYPE_18K6C_INVENTORY_ROUND_BEGIN:
		TRACE(_T("Packet type: RFID_PACKET_18K6C_INVENTORY_ROUND_BEGIN\n"));
		break;
	case RFID_PACKET_TYPE_18K6C_INVENTORY_ROUND_END:
		TRACE(_T("Packet type: RFID_PACKET_18K6C_INVENTORY_ROUND_END\n"));
		break;
	case RFID_PACKET_TYPE_18K6C_INVENTORY:
		{
			RFID_PACKET_18K6C_INVENTORY *inv = (RFID_PACKET_18K6C_INVENTORY *)packet;
			int length = (MacToHost16(common->pkt_len)-1)*4 - (common->flags >> 6);

			if(common->flags)
			{
				TRACE(_T("CRC Check Error\n"));
				break;
			}

//			parent->AddRadioPacket(common, packetType);

			break;
		}
	default:
		TRACE(_T("Packet type %u not handled yet\n"), packetType);
		break;
	}
}

INT32S PacketCallbackFunction(RFID_RADIO_HANDLE   handle,
							  INT32U              bufferLength,
							  const INT8U*        pBuffer,
							  void *              context)
{
	INT32S	status = 0;
	int *indent = (int *)context;

	/* Process the packets in the buffer until either the entire buffer is    */
	/* processed.                   
	*/
	while (!status && bufferLength)
	{
		/* Get the packet pointer and determine the length in bytes           */
		RFID_PACKET_COMMON*   pPacket = 
			(RFID_PACKET_COMMON *) pBuffer;
		INT32U packetLength    = 
			(MacToHost16(pPacket->pkt_len) * BYTES_PER_LEN_UNIT) + sizeof(RFID_PACKET_COMMON);

		/* Verify that the buffer is large enough for the packet              */
		if (bufferLength < packetLength )
		{
			TRACE(_T("ERROR: Remaining buffer = %d bytes, need %d bytes\n"),
				bufferLength,
				packetLength);
			status = -1;
		}
		else
		{
			INT16U packetType = 
				MacToHost16(pPacket->pkt_type);

			parent->AddRadioPacket(pPacket, context);

#ifdef _DEBUG_PACKET
			PrintPacket(pBuffer, *context);
#endif	// _DEBUG_PACKET
		}

		/* pkt_len is measured in 4-byte words, and
		doesn't include the 8-byte common preamble */
//		packetLength = MacToHost16(pPacket->pkt_len) * BYTES_PER_LEN_UNIT + 8;

		pBuffer += packetLength;
		bufferLength -= packetLength;
	}

	return status;
}

// Override Virtual Function for Thread
INT CRFIDRadio::Run(void)
{
	if(m_rfidHandle)
	{
		RFID_STATUS   status;
		UINT32 flags = 0;

		if ( m_bPerformSelectOpsFlag )
		{
			flags = 1;  //RFID_FLAG_PERFORM_SELECT
		}

		if ( m_bPerformPostMatchFlag )
		{
			flags |= 2; // RFID_FLAG_PERFORM_POST_MATCH
		}

		switch(m_runStatus)
		{
		case RFID_INVENTORY:
			{
				// Set up the inventory parameters
				m_rfid18K6CInventoryParms.length                = sizeof(RFID_18K6C_INVENTORY_PARMS);
				m_rfid18K6CInventoryParms.common.tagStopCount   = 0;
				m_rfid18K6CInventoryParms.common.pCallback      = PacketCallbackFunction;
				m_rfid18K6CInventoryParms.common.pCallbackCode  = 0;
				m_rfid18K6CInventoryParms.common.context        = &m_rfidIndentlevel;
				m_rfid18K6CInventoryParms.common.epc			= NULL;
				m_rfid18K6CInventoryParms.common.sel_flag		= 0;

				do
				{
					// Attempt to perform an inventory on the radio 
					if(RFID_STATUS_OK != 
						(status = RFID_18K6CTagInventory(m_rfidHandle, &m_rfid18K6CInventoryParms, flags)))
					{
						TRACE(_T("RFID_18K6CTagInventory failed: RC = %d\n"),status);
						break;
					}

					if(!IsActive())
					{
						break;
					}
				}while (m_nStopCountDown == -1 || // Run forever
					m_nStopCountDown-- > 0);
			}
			break;
		case RFID_READ:
			{
				INT8U			readData[EPC_WORD_LENGTH * 2];		// read data buffer : default 128 bit size
				CONTEXT_PARMS	context;							// read context parameter

				// initialize read parameter using input value
				context.operationSucceeded					= 0;
				context.pReadData							= readData;
				m_rfid18K6CReadParms.length					= sizeof(RFID_18K6C_READ_PARMS);
				m_rfid18K6CReadParms.bank					= m_MBank;
				m_rfid18K6CReadParms.count					= m_nCount;
				m_rfid18K6CReadParms.offset					= m_nOffset;
				m_rfid18K6CReadParms.accessPassword			= 0;
				m_rfid18K6CReadParms.common.pCallback		= PacketCallbackFunction;	// read callback function
				m_rfid18K6CReadParms.common.pCallbackCode	= NULL;
				m_rfid18K6CReadParms.common.tagStopCount	= 0;
				m_rfid18K6CReadParms.common.context			= &context;					// read context paramter

				if(m_epc != NULL)
				{
					m_rfid18K6CReadParms.common.epc				= m_epc;
					m_rfid18K6CReadParms.common.sel_flag		= true;
				}

				do
				{
					// Start tag read access process
					if(RFID_STATUS_OK !=
						(status =  RFID_18K6CTagRead(m_rfidHandle, &m_rfid18K6CReadParms, flags)))
					{
						TRACE(_T("RFID_18K6CTagRead failed: RC = %d\n"),status);
						break;
					}

					// Check tag read access success
					if( !IsActive() /*|| context.operationSucceeded ||*/)
					{
						NotifyStop();
// 
// 						if(RFID_STATUS_OK != 
// 							(status = RadioCancelOperation()))
// 						{
// 							TRACE1("RadioAbortOperation failed:  RC = %d\n", status);
// 						}

						break;
					}

				} while ( m_nStopCountDown == -1 || // Run forever
					m_nStopCountDown-- > 0);
			}
			break;
		case RFID_WRITE:
			{
				INT16U			writeData[8];						// write data buffer : default 128 bit size
				CONTEXT_PARMS	context;							// read context parameter

				context.operationSucceeded								= 0;
				context.pWriteData										= writeData;
				m_rfid18K6CWriteParms.length							= sizeof(RFID_18K6C_WRITE_PARMS);
				m_rfid18K6CWriteParms.writeType							= RFID_18K6C_WRITE_TYPE_SEQUENTIAL;
				m_rfid18K6CWriteParms.parameters.sequential.length		= sizeof(RFID_18K6C_WRITE_SEQUENTIAL_PARMS);
				m_rfid18K6CWriteParms.parameters.sequential.bank		= m_MBank;
				m_rfid18K6CWriteParms.parameters.sequential.count		= m_nCount;
				m_rfid18K6CWriteParms.parameters.sequential.offset		= m_nOffset;
				m_rfid18K6CWriteParms.parameters.sequential.pData		= m_nWriteData;
				m_rfid18K6CWriteParms.verify							= 1;
				m_rfid18K6CWriteParms.verifyRetryCount					= 7;
				m_rfid18K6CWriteParms.accessPassword					= 0;
				m_rfid18K6CWriteParms.common.pCallback					= PacketCallbackFunction;
				m_rfid18K6CWriteParms.common.pCallbackCode				= NULL;
				m_rfid18K6CWriteParms.common.tagStopCount				= 0;
				m_rfid18K6CWriteParms.common.context					= &context;

				if(m_epc != NULL)
				{
					m_rfid18K6CWriteParms.common.epc			= m_epc;
					m_rfid18K6CWriteParms.common.sel_flag		= true;
				}

				do
				{
					if(RFID_STATUS_OK !=
						(status =  RFID_18K6CTagWrite(m_rfidHandle, &m_rfid18K6CWriteParms, flags)))
					{
						TRACE(_T("RFID_18K6CTagWrite failed: RC = %d\n"),status);
						break;
					}

					// Check tag read access success
					if( !IsActive() /*|| context.operationSucceeded ||*/)
					{
						NotifyStop();
						break;
					}
				} while ( m_nStopCountDown == -1 || // Run forever
					m_nStopCountDown-- > 0);
			}
			break;
		case RFID_LOCK:
			{
				RFID_18K6C_LOCK_PARMS m_rfid18K6CLockParms;
				CONTEXT_PARMS	context;							// read context parameter

				context.operationSucceeded									= 0;
				m_rfid18K6CLockParms.length									= sizeof(RFID_18K6C_LOCK_PARMS);
				m_rfid18K6CLockParms.common.tagStopCount					= 0;
				m_rfid18K6CLockParms.common.pCallback						= PacketCallbackFunction;
				m_rfid18K6CLockParms.common.pCallbackCode					= NULL;
				m_rfid18K6CLockParms.common.context							= &context;
				m_rfid18K6CLockParms.common.epc								= m_epc;
				m_rfid18K6CLockParms.common.sel_flag						= true;

				m_rfid18K6CLockParms.permissions							= m_lockPermission;
				m_rfid18K6CLockParms.accessPassword							= m_AccessPassword;


				if(m_epc != NULL)
				{
					m_rfid18K6CLockParms.common.epc				= m_epc;
					m_rfid18K6CLockParms.common.sel_flag		= true;
				}

				// 			m_rfid18K6CLockParms.permissions.accessPasswordPermissions = accessPasswordPermissions;
				// 			m_rfid18K6CLockParms.permissions.epcMemoryBankPermissions  = epcMemoryBankPermissions;
				// 			m_rfid18K6CLockParms.permissions.tidMemoryBankPermissions  = tidMemoryBankPermissions;
				// 			m_rfid18K6CLockParms.permissions.userMemoryBankPermissions = userMemoryBankPermissions;

				do
				{
					if(RFID_STATUS_OK !=
						(status =  RFID_18K6CTagLock(m_rfidHandle, &m_rfid18K6CLockParms, flags)))
					{
						TRACE(_T("RFID_18K6CTagLock failed: RC = %d\n"),status);
						break;
					}

					// Check tag read access success
					if( !IsActive() /*|| context.operationSucceeded ||*/)
					{
						NotifyStop();
						break;
					}
				} while ( m_nStopCountDown == -1 || // Run forever
					m_nStopCountDown-- > 0);
			}
			break;
		case RFID_KILL:
			{
				RFID_18K6C_KILL_PARMS m_rfid18K6CKillParms;
				CONTEXT_PARMS	context;							// read context parameter

				context.operationSucceeded								= 0;
				m_rfid18K6CKillParms.common.tagStopCount					= 0;
				m_rfid18K6CKillParms.common.pCallback						= PacketCallbackFunction;
				m_rfid18K6CKillParms.common.pCallbackCode					= NULL;
				m_rfid18K6CKillParms.common.context							= &context;
				m_rfid18K6CKillParms.killPassword							= m_KillPassword;
				m_rfid18K6CKillParms.accessPassword							= m_AccessPassword;

				if(m_epc != NULL)
				{
					m_rfid18K6CKillParms.common.epc				= m_epc;
					m_rfid18K6CKillParms.common.sel_flag		= true;
				}

				do
				{
					if(RFID_STATUS_OK !=
						(status =  RFID_18K6CTagKill(m_rfidHandle, &m_rfid18K6CKillParms, flags)))
					{
						TRACE(_T("RFID_18K6CTagKill failed: RC = %d\n"),status);
						break;
					}

					// Check tag read access success
					if( !IsActive() /*|| context.operationSucceeded ||*/)
					{
						NotifyStop();
						break;
					}
				} while ( m_nStopCountDown == -1 || // Run forever
					m_nStopCountDown-- > 0);
			}
			break;
		}

	}

	m_epc = NULL;

	return 0L;
}

RFID_STATUS CRFIDRadio::RadioCancelOperation(void)
{
	RFID_STATUS   status = RFID_STATUS_OK;

	if(m_rfidHandle)
	{
		if( RFID_STATUS_OK != 
			(status = RFID_RadioCancelOperation(m_rfidHandle, 0)))
		{
			TRACE1("RFID_RadioCancelOperation failed: RC = %d\n",status);
			return status;
		}
	}

	return status;
}

RFID_STATUS CRFIDRadio::RadioAbortOperation(void)
{
	RFID_STATUS   status = RFID_STATUS_OK;

	if(m_rfidHandle)
	{
		if( RFID_STATUS_OK != 
			(status = RFID_RadioAbortOperation(m_rfidHandle, 0)))
		{
			TRACE1("RFID_RadioAbortOperation failed: RC = %d\n",status);
			return status;
		}
	}

	return status;
}

RFID_STATUS CRFIDRadio::SetRadioOperationMode(RFID_RADIO_OPERATION_MODE mode)
{
	RFID_STATUS   status = RFID_STATUS_OK;

	if(RFID_STATUS_OK !=
		(status = 
		RFID_RadioSetOperationMode(m_rfidHandle, 
		mode)))
	{
		TRACE1("RFID_RadioSetOperationMode failed:  RC = %d\n", status);
		return status;
	}

	return status;
}

RFID_STATUS CRFIDRadio::GetRadioOperationMode(RFID_RADIO_OPERATION_MODE* mode)
{
	RFID_STATUS   status = RFID_STATUS_OK;

	if(m_rfidHandle != NULL)
		if(RFID_STATUS_OK !=
			(status = 
			RFID_RadioGetOperationMode(m_rfidHandle, 
			mode)))
		{
			TRACE1("RFID_RadioGetOperationMode failed:  RC = %d\n", status);
			return status;
		}

	return status;
}

RFID_STATUS CRFIDRadio::SetRadioTransferTime(UINT32 time)
{
	RFID_STATUS   status = RFID_STATUS_OK;

	if(RFID_STATUS_OK !=
		(status = 
		RFID_RadioSetTransferTime(m_rfidHandle, 
		time)))
	{
		TRACE1("RFID_RadioSetTransferTime failed:  RC = %d\n", status);
		return status;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -