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

📄 dlgpgconfiguration.cpp

📁 1394测试程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DlgPgConfiguration.cpp : implementation file
//

#include "stdafx.h"
#include "TestApp.h"
#include "DlgPgConfiguration.h"
#include "ddx_ex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDlgPgConfiguration dialog


CDlgPgConfiguration::CDlgPgConfiguration(CWnd* pParent /*=NULL*/)
	: CDialogPage(CDlgPgConfiguration::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgPgConfiguration)
	m_ValVendorLeafSize = 0;
	m_ValModelLeafSize = 0;
	m_ValUnitDepDirSize = 0;
	m_ValUnitDirSize = 0;
	m_ValHCGapCount = 63;
	m_CheckHCSetGapCount = FALSE;
	m_CheckModelLeaf = FALSE;
	m_CheckUnitDepDir = FALSE;
	m_CheckVendorLeaf = FALSE;
	m_CheckUnitDir = FALSE;
	m_nEachValue = 0;
	//}}AFX_DATA_INIT
}


void CDlgPgConfiguration::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgPgConfiguration)
	DDX_Control(pDX, IDC_CHECK_MODEL_LEAF, m_ButtonGetModelLeaf);
	DDX_Control(pDX, IDC_CHECK_VENDOR_LEAF, m_ButtonGetVendorLeaf);
	DDX_Control(pDX, IDC_CHECK_UNIT_DIR, m_ButtonGetUnitDir);
	DDX_Control(pDX, IDC_CHECK_UNIT_DEP_DIR, m_ButtonGetUnitDepDir);
	DDX_Control(pDX, IDC_CHECK_HC_GAPCOUNT, m_ButtonHCSetGapCount);
	DDX_Control(pDX, IDC_EDIT_NEW_GAPCOUNT, m_EditCtrlHCGapCountValue);
	DDX_Text(pDX, IDC_EDIT_NEW_GAPCOUNT, m_ValHCGapCount);
	DDV_MinMaxDWord(pDX, m_ValHCGapCount, 1, 63);
	DDX_Check(pDX, IDC_CHECK_HC_GAPCOUNT, m_CheckHCSetGapCount);
	DDX_Check(pDX, IDC_CHECK_MODEL_LEAF, m_CheckModelLeaf);
	DDX_Check(pDX, IDC_CHECK_UNIT_DEP_DIR, m_CheckUnitDepDir);
	DDX_Check(pDX, IDC_CHECK_VENDOR_LEAF, m_CheckVendorLeaf);
	DDX_Check(pDX, IDC_CHECK_UNIT_DIR, m_CheckUnitDir);
	DDX_Control(pDX, IDC_COMBO_DEVPROP_SPEED, m_ComboDevPropSpeed);
	DDX_Radio(pDX, IDC_RADIO_HCGET_UNI_ID, m_nEachValue);
	//}}AFX_DATA_MAP

}


BEGIN_MESSAGE_MAP(CDlgPgConfiguration, CDialog)
	//{{AFX_MSG_MAP(CDlgPgConfiguration)
	ON_BN_CLICKED(IDC_BUTTON_CONFIG_INFO, OnButtonConfigInfo)
	ON_BN_CLICKED(IDC_BUTTON_DEV_GET, OnButtonDevGet)
	ON_BN_CLICKED(IDC_BUTTON_HC_GET, OnButtonHcGet)
	ON_BN_CLICKED(IDC_BUTTON_DEV_SET, OnButtonDevSet)
	ON_BN_CLICKED(IDC_BUTTON_HC_SET, OnButtonHcSet)
	ON_BN_CLICKED(IDC_CHECK_HC_GAPCOUNT, OnCheckHCGapCount)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgPgConfiguration message handlers


void CDlgPgConfiguration::OnSelectionChange(BOOL bSelected)
{
	if ( bSelected == TRUE ) {
		// reset check boxes everytime we are selected,
		// this is because actual opened device may have changed
		m_ValVendorLeafSize = 0;
		m_ValModelLeafSize = 0;
		m_ValUnitDepDirSize = 0;
		m_ValUnitDirSize = 0;

		UpdateCheckBoxes();
		UpdateData(FALSE);
	}

}


BOOL CDlgPgConfiguration::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// fill combo box for set max. speed to device
	m_ComboDevPropSpeed.Init(g_SpeedSelectorTab);

	UpdateCheckBoxes();
	UpdateEditBoxesStates();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


//首先用OnButtonConfigInfo()得到所有缓冲区的大小,然后开辟相应大小的缓冲区,用OnButtonDevGet()再次发送IRP得到所需内容
//这两个函数以及驱动程序中的相应代码需要验证
void CDlgPgConfiguration::OnButtonConfigInfo() 
{
	/*
	typedef struct _Get_1394_CONFIG_INFO_PARAMS
	{
		CONFIG_ROM      ConfigRom;                          // config rom
		ULONG           UnitDirectoryBufferSize;
		IO_ADDRESS      UnitDirectoryLocation;              // Starting Location of Unit Directory
		ULONG           UnitDependentDirectoryBufferSize;
		IO_ADDRESS      UnitDependentDirectoryLocation;
		ULONG           VendorLeafBufferSize;               // Size available to get vendor leafs
		ULONG           ModelLeafBufferSize;                // Size available to get model leafs    
	} Get_Config_Info_Params,*PGet_Config_Info_Params;
*/
	Get_Config_Info_Params  InfoParams;
	InfoParams.UnitDirectoryBufferSize = 0;
	InfoParams.UnitDependentDirectoryBufferSize = 0;
	InfoParams.VendorLeafBufferSize = 0;
	InfoParams.ModelLeafBufferSize = 0;

	DWORD Status = g_CurrentDev.GetDeviceConfigInfo(&InfoParams,sizeof(Get_Config_Info_Params));	
	if ( Status == STATUS_SUCCESS ) 
	{
		// save new buffer sizes, update check boxes enable state
		m_ValUnitDirSize = InfoParams.UnitDirectoryBufferSize;
		m_ValUnitDepDirSize = InfoParams.UnitDependentDirectoryBufferSize;
		m_ValVendorLeafSize = InfoParams.VendorLeafBufferSize;
		m_ValModelLeafSize = InfoParams.ModelLeafBufferSize;
		UpdateCheckBoxes();
	}
	else 
	{
		PrintOut(NL"GetDeviceConfigInfo() failed"NL);
		PrintError(Status);
	}
	PrintOut(NL);
}


void CDlgPgConfiguration::OnButtonDevGet() 
{
	/*		
	const unsigned int UnitDirectory = 0;
	const unsigned int UnitDependentDirectory = 1;
	const unsigned int VendorLeaf = 2;
	const unsigned int ModelLeaf = 3;
	*/
	unsigned int BlockType;
	unsigned char* BlockBufPtr;	
	DWORD BufSize;
	DWORD Status;
	DWORD i;

	if ( UpdateData(TRUE)	)
	{
		if ( m_CheckUnitDir ) 
		{
			BufSize = m_ValUnitDirSize;
			BlockBufPtr = NULL;
			BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);				
			BlockType = UnitDirectory;
			Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
			if (Status == STATUS_SUCCESS) 
			{
				// write the results to output window
//				PrintOut("UnitDirectory (%d bytes) successfully read:", BufSize);
				for (i=0; i<BufSize; i++) {
					if ( (i % 4) == 0 ) {
						PrintOut(NL"  ");
					}
	//				PrintOut("0x%02X ", *BlockBufPtr);
		//			BlockBufPtr++;
				}
				PrintOut(NL);
			}
			PrintOut(NL);
		}	
		if ( m_CheckUnitDepDir ) 
		{
			BufSize = m_ValUnitDepDirSize;
			BlockBufPtr = NULL;
			BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);			
			BlockType = UnitDependentDirectory;
			Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
			if (Status == STATUS_SUCCESS) {
				// write the results to output window
//				PrintOut("UnitDependentDirectory (%d bytes) successfully read:", BufSize);
				for (i=0; i<BufSize; i++) {
					if ( (i % 4) == 0 ) {
						PrintOut(NL"  ");
					}
//					PrintOut("0x%02X ", *BlockBufPtr);
//					BlockBufPtr++;
				}
				PrintOut(NL);
			}
			PrintOut(NL);
		}	
		/*
		typedef struct _TEXTUAL_LEAF {
			USHORT              TL_CRC;                 // using 1994 CRC algorithm
			USHORT              TL_Length;              // length of leaf in quads
			ULONG               TL_Spec_Id;             // vendor defined
			ULONG               TL_Language_Id;         // language Id
			UCHAR               TL_Data;                // variable length data
		} TEXTUAL_LEAF, *PTEXTUAL_LEAF;
		*/
		if ( m_CheckVendorLeaf ) 
		{
			BufSize = (sizeof(TEXTUAL_LEAF)-1) + m_ValVendorLeafSize;
			BlockBufPtr = NULL;
			BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);			
			BlockType = VendorLeaf;
			Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
			if (Status == STATUS_SUCCESS) {
				// write the results to output window
//				PrintOut("VendorLeaf (%d bytes) successfully read:"NL, BufSize);
				// ### it seems that string length field doesn磘 match the real value
/*				PrintOut("  String length: %d bytes  String CRC: 0x%04X"NL,
											(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLength),
											(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafCRC));
				PrintOut("  Language ID: 0x%X  Specification ID of Language ID: 0x%X"NL,
											((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLangID,
											((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafSpecID);

				PrintOut("  String is: "); 
				PrintOut("%S"NL,((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafData); 
*/
			}
			PrintOut(NL);
		}	

		if ( m_CheckModelLeaf ) 
		{
			BufSize = (sizeof(TEXTUAL_LEAF)-1) + m_ValModelLeafSize;
			BlockBufPtr = NULL;
			BlockBufPtr = (unsigned char*)realloc(BlockBufPtr, BufSize);			
			BlockType = ModelLeaf;
			Status = g_CurrentDev.GetDeviceInfoBlock(&BlockType, BlockBufPtr, &BufSize);
			if (Status == STATUS_SUCCESS) {
/*				// write the results to output window
				PrintOut("ModelLeaf (%d bytes) successfully read:"NL, BufSize);
				// ### it seems that string length field doesn磘 match the real value
				PrintOut("  String length: %d bytes  String CRC: 0x%04X"NL,
											(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLength),
											(USHORT)(((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafCRC));
				PrintOut("  Language ID: 0x%X  Specification ID of Language ID: 0x%X"NL,
											((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafLangID,
											((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafSpecID);

				PrintOut("  String is: "); 
				PrintOut("%S"NL,((SPEC1394_TEXTUAL_LEAF_INFO*)BlockBufPtr)->LeafData); 
*/
			}
			PrintOut(NL);
		}
	}
}

void CDlgPgConfiguration::OnButtonDevSet() 
{	
	DEVICE_XMIT_PROPERTIES XmitProps;
	
	if ( UpdateData(TRUE)	) {
		XmitProps.fulSpeed = m_ComboDevPropSpeed.GetCurItemData();
		
		// call driver (through class library)
		DWORD Status = g_CurrentDev.SetDeviceXmitProperties(&XmitProps);
		if (Status == STATUS_SUCCESS) {
			PrintOut("New Device Xmit Properties successfully set"NL);
		} else {
			PrintOut(NL"SetDeviceXmitProperties() failed"NL);
			PrintError(Status);
		}
		PrintOut(NL);
	}
}

//get、set host的函数OnButtonHcGet()和OnButtonHcSet()也需要测试
/*总共有六种类型,前三种分配空间,发送IRP即可
  第四种与分配计算机端的1394地址空间有关
  第五种和第六种都存在可能分配的缓冲区不够的问题,可先发一个IRP过去,如果返回
  ERROR_INSUFFICIENT_BUFFER,则返回了正确的缓冲区长度,重新分配,重发IRP
*/
void CDlgPgConfiguration::OnButtonHcGet() 
{
	/*	
	//
	typedef struct _GET_LOCAL_HOST_INFORMATION {
		ULONG           Status;
		ULONG           nLevel;
		ULONG           ulBufferSize;
		UCHAR           Information[1];
	} GET_LOCAL_HOST_INFORMATION, *PGET_LOCAL_HOST_INFORMATION;
	*/	
	PGET_LOCAL_HOST_INFORMATION pGetLocalHostInfo;
	ULONG nLength;
	if ( UpdateData(TRUE)	) 
	{

		if ( m_nEachValue == 0 ) //GET_HOST_UNIQUE_ID GET_LOCAL_HOST_INFO1 主机控制器ID
		{
			nLength = sizeof(GET_LOCAL_HOST_INFORMATION) + sizeof(GET_LOCAL_HOST_INFO1);
			pGetLocalHostInfo = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, nLength);
			pGetLocalHostInfo->Status = 0;
			pGetLocalHostInfo->nLevel = GET_HOST_UNIQUE_ID;
			pGetLocalHostInfo->ulBufferSize = nLength;
	
			// call driver (through class library)
			DWORD Status = g_CurrentDev.GetLocalHostInfo(pGetLocalHostInfo);
			if ( Status == STATUS_SUCCESS && pGetLocalHostInfo->Status == 0 )
			{
				// display information	
				PrintOut("get host success"NL);
				PGET_LOCAL_HOST_INFO1   LocalHostInfo1;

⌨️ 快捷键说明

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