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

📄 test1394.cpp

📁 基于IEEE 1394总线的图像采集及处理系统软件技术研究
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Test1394.cpp: implementation of the CTest1394 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "test1394show.h"
#include "Test1394.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTest1394::CTest1394()
{
	// initialize members
	mFileHandle = NULL;
	ZeroMemory(&mOverlapped,sizeof(mOverlapped));
	InitializeCriticalSection(&mCritSect);
	mDevDetail=NULL;

	mCheckedBuildDetected = FALSE;
	mDemoVersionDetected = FALSE;
}

CTest1394::~CTest1394()
{
	// close file handle, free mDevDetail
	Close();
	// free resources
	DeleteCriticalSection(&mCritSect);
}

void CTest1394::Close()
{
	if ( mFileHandle != NULL ) {
		::CloseHandle(mFileHandle);
		mFileHandle = NULL;
	}

	if ( mOverlapped.hEvent != NULL ) {
		::CloseHandle(mOverlapped.hEvent);
		mOverlapped.hEvent = NULL;
	}

	// delete detail info if any
	if ( mDevDetail!=NULL ) {
		delete[] (char*)mDevDetail;
		mDevDetail = NULL;
	}
}

//DEL HDEVINFO CTest1394::CreateDeviceList( GUID *InterfaceGuid)
//DEL {
//DEL 	HDEVINFO h;
//DEL 
//DEL 	h = SetupDiGetClassDevs(
//DEL 				(GUID*)InterfaceGuid,									// LPGUID ClassGuid, 
//DEL 				NULL,																  // PCTSTR Enumerator, 
//DEL 				NULL,																	// HWND hwndParent, 
//DEL 				DIGCF_DEVICEINTERFACE | DIGCF_PRESENT	// DWORD Flags
//DEL 				);
//DEL 	return ( (h==INVALID_HANDLE_VALUE) ? NULL : h );
//DEL }

//DEL void CTest1394::DestroyDeviceList(HDEVINFO DeviceList)
//DEL {
//DEL 	if ( DeviceList!=NULL ) {
//DEL 		SetupDiDestroyDeviceInfoList(DeviceList);
//DEL 	}
//DEL }

DWORD CTest1394::ForceBusReset( ULONG fulFlags)
{
	DWORD Status;

	Status = IoctlSync(
							IOCTL_TEST1394_BUS_RESET,
							&fulFlags,
							sizeof(ULONG),
							NULL,
							0,
							NULL
							);

	return Status;
}

DWORD CTest1394::GetLocalHostInfo( PGET_LOCAL_HOST_INFORMATION GetLocalHostInfo)
{
	DWORD Status;
	// we don't support auto alloc for nLevel = 5 or 6
	if (GetLocalHostInfo->nLevel == 6)
	{
		PGET_LOCAL_HOST_INFORMATION     pGetLocalHostInformation;
        PGET_LOCAL_HOST_INFO6           LocalHostInfo6;
        ULONG                           ulBufferSize;
        ULONG                           CsrDataLength;
        ULONG                           CsrDataAddress;
        DWORD                           dwRet;

        // let's get the CsrDataAddress from Status. (from the dialog)
        CsrDataAddress = GetLocalHostInfo->Status;

        // first thing is to get the buffer size we need...
        ulBufferSize = sizeof(GET_LOCAL_HOST_INFORMATION) + sizeof(GET_LOCAL_HOST_INFO6);

        pGetLocalHostInformation = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
        LocalHostInfo6 = (PGET_LOCAL_HOST_INFO6)&pGetLocalHostInformation->Information;

        pGetLocalHostInformation->nLevel = 6;
        pGetLocalHostInformation->ulBufferSize = ulBufferSize;

        LocalHostInfo6->CsrBaseAddress.Off_High = INITIAL_REGISTER_SPACE_HI;
        LocalHostInfo6->CsrBaseAddress.Off_Low = CsrDataAddress;

        dwRet = GetLocalHostInformation(pGetLocalHostInformation,FALSE);

        if (dwRet == ERROR_INSUFFICIENT_BUFFER) {

            // we should have our buffer info.
//            TRACE(TL_TRACE, (hWnd, "Insufficient Buffer\r\n"));
  //          TRACE(TL_TRACE, (hWnd, "CsrDataLength = 0x%x\r\n", LocalHostInfo6->CsrDataLength));

            CsrDataLength = LocalHostInfo6->CsrDataLength;

            LocalFree(pGetLocalHostInformation);

            // start over with a big enough buffer
            ulBufferSize = sizeof(GET_LOCAL_HOST_INFORMATION) + sizeof(GET_LOCAL_HOST_INFO6) + CsrDataLength;

            pGetLocalHostInformation = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
            LocalHostInfo6 = (PGET_LOCAL_HOST_INFO6)&pGetLocalHostInformation->Information;

            pGetLocalHostInformation->nLevel = 6;
            pGetLocalHostInformation->ulBufferSize = ulBufferSize;

            LocalHostInfo6->CsrBaseAddress.Off_High = INITIAL_REGISTER_SPACE_HI;
            LocalHostInfo6->CsrBaseAddress.Off_Low = CsrDataAddress;
            LocalHostInfo6->CsrDataLength = CsrDataLength;

            dwRet = GetLocalHostInformation( pGetLocalHostInformation,FALSE );

            if (LocalHostInfo6->CsrBaseAddress.Off_Low == SPEED_MAP_LOCATION) //还有tobology map
			{

                PSPEED_MAP                      SpeedMap;
                PGET_LOCAL_HOST_INFORMATION     pGetTopologyMap;
                PGET_LOCAL_HOST_INFO6           pTopologyInfo;
                PTOPOLOGY_MAP                   TopologyMap;
                ULONG                           NodeCount, i, j;

                SpeedMap = (PSPEED_MAP)&LocalHostInfo6->CsrDataBuffer;

                // get the node count from the topology map
                pGetTopologyMap = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, sizeof(GET_LOCAL_HOST_INFO6) + 4096);

                pGetTopologyMap->ulBufferSize = sizeof(GET_LOCAL_HOST_INFO6) + 4096;
                pGetTopologyMap->nLevel = 6;
                pTopologyInfo = (PGET_LOCAL_HOST_INFO6)&pGetTopologyMap->Information;

                pTopologyInfo->CsrDataLength = 4096; //0x400;
                pTopologyInfo->CsrBaseAddress.Off_High = INITIAL_REGISTER_SPACE_HI;
                pTopologyInfo->CsrBaseAddress.Off_Low = TOPOLOGY_MAP_LOCATION;

                dwRet = GetLocalHostInformation( pGetTopologyMap,
                                                 FALSE
                                                 );

                TopologyMap = (PTOPOLOGY_MAP)&pTopologyInfo->CsrDataBuffer;
                NodeCount = TopologyMap->TOP_Node_Count;

                LocalFree(TopologyMap);

                if (!dwRet) {

       //             TRACE(TL_TRACE, (hWnd, "SpeedCodes = \t"));

                    for (i=0; i < NodeCount; i++) {

                        for (j=0; j < NodeCount; j++) {

     //                       TRACE(TL_TRACE, (hWnd, "%d\t", SpeedMap->SPD_Speed_Code[i*64+j]));
                        }

  //                      TRACE(TL_TRACE, (hWnd, "\r\n\t\t"));
                    }
                }
                else {

//                    TRACE(TL_ERROR, (hWnd, "Error getting NodeCount\r\n"));
                }
   //             TRACE(TL_TRACE, (hWnd, "\r\n"));
            }

            LocalFree(pGetLocalHostInformation);

        }
        else
            LocalFree(pGetLocalHostInformation);
	}
	else
		Status = GetLocalHostInformation(GetLocalHostInfo,TRUE);
	return Status;
}

DWORD CTest1394::GetLocalHostInformation( PGET_LOCAL_HOST_INFORMATION GetLocalHostInfo, BOOL bAutoAlloc)
{
	PGET_LOCAL_HOST_INFORMATION     pGetLocalHostInfo;
	DWORD	dwRet, dwBytesRet;
    ULONG	ulBufferSize;
	GetLocalHostInfo->Status = 0;
	if(bAutoAlloc)
	{
		if (GetLocalHostInfo->nLevel == 1)
			ulBufferSize = sizeof(GET_LOCAL_HOST_INFO1);
		else if (GetLocalHostInfo->nLevel == 2)
			ulBufferSize = sizeof(GET_LOCAL_HOST_INFO2);
		else if (GetLocalHostInfo->nLevel == 3)
			ulBufferSize = sizeof(GET_LOCAL_HOST_INFO3);
		else if (GetLocalHostInfo->nLevel == 4)
			ulBufferSize = sizeof(GET_LOCAL_HOST_INFO4);
		else if (GetLocalHostInfo->nLevel == 5) 
		{
			dwRet = ERROR_INVALID_FUNCTION;
			goto Exit_GetLocalHostInfo;
	//            ulBufferSize = sizeof(GET_LOCAL_HOST_INFO5);
		}
		else if (GetLocalHostInfo->nLevel == 6) 
		{
			dwRet = ERROR_INVALID_FUNCTION;
			goto Exit_GetLocalHostInfo;
		}

		 ulBufferSize += sizeof(GET_LOCAL_HOST_INFORMATION);
		pGetLocalHostInfo = (PGET_LOCAL_HOST_INFORMATION)LocalAlloc(LPTR, ulBufferSize);
		*pGetLocalHostInfo = *GetLocalHostInfo;
	}
	else
	{
		pGetLocalHostInfo = GetLocalHostInfo;
        ulBufferSize = GetLocalHostInfo->ulBufferSize;
	}
    
	dwRet = IoctlSync(
							IOCTL_TEST1394_GET_LOCAL_HOST_INFO,
							pGetLocalHostInfo,
							ulBufferSize,
							pGetLocalHostInfo,
							ulBufferSize,
							NULL
							);
	if ((dwRet) && (!pGetLocalHostInfo->Status)) 
	{

        dwRet = ERROR_SUCCESS;

        if (pGetLocalHostInfo->nLevel == 1) {

            PGET_LOCAL_HOST_INFO1   LocalHostInfo1;

            LocalHostInfo1 = (PGET_LOCAL_HOST_INFO1)&pGetLocalHostInfo->Information;

	/*            TRACE(TL_TRACE, (hWnd, "UniqueId.LowPart = 0x%x\r\n", LocalHostInfo1->UniqueId.LowPart));
            TRACE(TL_TRACE, (hWnd, "UniqueId.HighPart = 0x%x\r\n", LocalHostInfo1->UniqueId.HighPart));
*/        }
        else if (pGetLocalHostInfo->nLevel == 2) {

            PGET_LOCAL_HOST_INFO2   LocalHostInfo2;

            LocalHostInfo2 = (PGET_LOCAL_HOST_INFO2)&pGetLocalHostInfo->Information;

/*            TRACE(TL_TRACE, (hWnd, "HostCapabilities = 0x%x\r\n", LocalHostInfo2->HostCapabilities));
            TRACE(TL_TRACE, (hWnd, "MaxAsyncReadRequest = 0x%x\r\n", LocalHostInfo2->MaxAsyncReadRequest));
            TRACE(TL_TRACE, (hWnd, "MaxAsyncWriteRequest = 0x%x\r\n", LocalHostInfo2->MaxAsyncWriteRequest));
  */      }
        else if (pGetLocalHostInfo->nLevel == 3) {

            PGET_LOCAL_HOST_INFO3   LocalHostInfo3;

            LocalHostInfo3 = (PGET_LOCAL_HOST_INFO3)&pGetLocalHostInfo->Information;

//            TRACE(TL_TRACE, (hWnd, "deciWattsSupplied = 0x%x\r\n", LocalHostInfo3->deciWattsSupplied));
//            TRACE(TL_TRACE, (hWnd, "Voltage = 0x%x\r\n", LocalHostInfo3->Voltage));
        }
        else if (pGetLocalHostInfo->nLevel == 4) {

            PGET_LOCAL_HOST_INFO4   LocalHostInfo4;

            LocalHostInfo4 = (PGET_LOCAL_HOST_INFO4)&pGetLocalHostInfo->Information;

//            TRACE(TL_TRACE, (hWnd, "PhysAddrMappingRoutine = 0x%x\r\n", LocalHostInfo4->PhysAddrMappingRoutine));
//            TRACE(TL_TRACE, (hWnd, "Context = 0x%x\r\n", LocalHostInfo4->Context));
        }
        else if (pGetLocalHostInfo->nLevel == 5) {

            PGET_LOCAL_HOST_INFO5   LocalHostInfo5;

            LocalHostInfo5 = (PGET_LOCAL_HOST_INFO5)&pGetLocalHostInfo->Information;

//            TRACE(TL_TRACE, (hWnd, "ConfigRom = 0x%x\r\n", LocalHostInfo5->ConfigRom));
//            TRACE(TL_TRACE, (hWnd, "ConfigRomLength = 0x%x\r\n", LocalHostInfo5->ConfigRomLength));
        }
        else if (pGetLocalHostInfo->nLevel == 6) {

            PGET_LOCAL_HOST_INFO6   LocalHostInfo6;

            LocalHostInfo6 = (PGET_LOCAL_HOST_INFO6)&pGetLocalHostInfo->Information;

//            TRACE(TL_TRACE, (hWnd, "CsrBaseAddress = 0x%x\r\n", LocalHostInfo6->CsrBaseAddress));
//            TRACE(TL_TRACE, (hWnd, "CsrDataLength = 0x%x\r\n", LocalHostInfo6->CsrDataLength));
//            TRACE(TL_TRACE, (hWnd, "CsrDataBuffer = 0x%x\r\n", &LocalHostInfo6->CsrDataBuffer));

            if (LocalHostInfo6->CsrBaseAddress.Off_Low == SPEED_MAP_LOCATION) {

                PSPEED_MAP  SpeedMap;
                ULONG       NumNodes, i;

                SpeedMap = (PSPEED_MAP)&LocalHostInfo6->CsrDataBuffer;

//                TRACE(TL_TRACE, (hWnd, "SpeedMap.SPD_Length = 0x%x\r\n", SpeedMap->SPD_Length));
//                TRACE(TL_TRACE, (hWnd, "SpeedMap.SPD_CRC = 0x%x\r\n", SpeedMap->SPD_CRC));
//                TRACE(TL_TRACE, (hWnd, "SpeedMap.SPD_Generation = 0x%x\r\n", SpeedMap->SPD_Generation));
            }
            else if (LocalHostInfo6->CsrBaseAddress.Off_Low == TOPOLOGY_MAP_LOCATION) {

                PTOPOLOGY_MAP   TopologyMap;
                ULONG           i;
                PSELF_ID        SelfId;
                PSELF_ID_MORE   SelfIdMore;
                BOOL            bMore;

                TopologyMap = (PTOPOLOGY_MAP)&LocalHostInfo6->CsrDataBuffer;
/*
                TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Length = 0x%x\r\n", TopologyMap->TOP_Length));
                TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_CRC = 0x%x\r\n", TopologyMap->TOP_CRC));
                TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Generation = 0x%x\r\n", TopologyMap->TOP_Generation));
                TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Node_Count = 0x%x\r\n", TopologyMap->TOP_Node_Count));
                TRACE(TL_TRACE, (hWnd, "TopologyMap.TOP_Self_ID_Count = 0x%x\r\n", TopologyMap->TOP_Self_ID_Count));
*/
                for (i=0; i < TopologyMap->TOP_Self_ID_Count; i++) {

                    SelfId = &TopologyMap->TOP_Self_ID_Array[i];
/*
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Phys_ID = 0x%x\r\n", i, SelfId->SID_Phys_ID));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Packet_ID = 0x%x\r\n", i, SelfId->SID_Packet_ID));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Gap_Count = 0x%x\r\n", i, SelfId->SID_Gap_Count));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Link_Active = 0x%x\r\n", i, SelfId->SID_Link_Active));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Zero = 0x%x\r\n", i, SelfId->SID_Zero));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Power_Class = 0x%x\r\n", i, SelfId->SID_Power_Class));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Contender = 0x%x\r\n", i, SelfId->SID_Contender));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Delay = 0x%x\r\n", i, SelfId->SID_Delay));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Speed = 0x%x\r\n", i, SelfId->SID_Speed));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_More_Packets = 0x%x\r\n", i, SelfId->SID_More_Packets));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Initiated_Rst = 0x%x\r\n", i, SelfId->SID_Initiated_Rst));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Port3 = 0x%x\r\n", i, SelfId->SID_Port3));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Port2 = 0x%x\r\n", i, SelfId->SID_Port2));
                    TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Port1 = 0x%x\r\n", i, SelfId->SID_Port1));
*/
                    if (SelfId->SID_More_Packets)
                        bMore = TRUE;
                    else
                        bMore = FALSE;

                    while (bMore) {

                        i++;

                        SelfIdMore = (PSELF_ID_MORE)&TopologyMap->TOP_Self_ID_Array[i];
/*
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Phys_ID = 0x%x\r\n", i, SelfIdMore->SID_Phys_ID));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Packet_ID = 0x%x\r\n", i, SelfIdMore->SID_Packet_ID));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortA = 0x%x\r\n", i, SelfIdMore->SID_PortA));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Reserved2 = 0x%x\r\n", i, SelfIdMore->SID_Reserved2));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Sequence = 0x%x\r\n", i, SelfIdMore->SID_Sequence));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_One = 0x%x\r\n", i, SelfIdMore->SID_One));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortE = 0x%x\r\n", i, SelfIdMore->SID_PortE));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortD = 0x%x\r\n", i, SelfIdMore->SID_PortD));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortC = 0x%x\r\n", i, SelfIdMore->SID_PortC));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortB = 0x%x\r\n", i, SelfIdMore->SID_PortB));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_More_Packets = 0x%x\r\n", i, SelfIdMore->SID_More_Packets));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_Reserved3 = 0x%x\r\n", i, SelfIdMore->SID_Reserved3));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortH = 0x%x\r\n", i, SelfIdMore->SID_PortH));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortG = 0x%x\r\n", i, SelfIdMore->SID_PortG));
                        TRACE(TL_TRACE, (hWnd, "SelfId[%d].SID_PortF = 0x%x\r\n", i, SelfIdMore->SID_PortF));
*/
                        if (SelfIdMore->SID_More_Packets)
                            bMore = TRUE;
                        else
                            bMore = FALSE;
                    }
                }
            }
            else {

  //              TRACE(TL_TRACE, (hWnd, "Unknown Data Buffer.\r\n"));
            }
        }
    }
    else if (pGetLocalHostInfo->Status) {

        // this means its an insufficient buffer, that's the only

⌨️ 快捷键说明

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