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

📄 adt700_impl.cpp

📁 ADT700的小程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ADT700_Impl.cpp: implementation of the CADT700_Impl class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ADT700_Impl.h"
#include <nkintr.h>
#include <ceddk.h>
#include <giisr.h>
#include "Pkfuncs.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*
void WriteMsg(int i,int j,float fValue)
{
	FILE *fp;
	fp=fopen("\\look.htm","ab+");
	if(fp==0)
		return;
	char str[100];
	memset(str,0,100);
	sprintf(str,"Channel:%d,Num:%d,Value:%f\r\n",i,j,fValue);
	fputs(str,fp);
	fclose(fp);
}
*/

void WriteMsg(int i,float nValue)
{
	return;
	FILE *fp;
	fp=fopen("\\adt650.htm","ab+");
	if(fp==0)
		return;
	char strMsg[20];
	sprintf(strMsg,"%d:%f\r\n",i,nValue);
	fputs(strMsg,fp);
	fclose(fp);
}

DWORD  WINAPI  ThreadIST( LPVOID lpvParam )
{
	int nPosIndex=0;
	DWORD  dwStatus;
	BOOL  fState = TRUE;
	CADT700_Impl *gObj=(CADT700_Impl *)lpvParam;
	// Always chec the running flag
	//
	while(gObj->m_fRun )
	{
		dwStatus  = WaitForSingleObject(gObj->m_hISTInterruptEvent, INFINITE);

		// Check to see if we are finished
		//
		if(!gObj->m_fRun ) 
			return 0;

		// Make sure we have the object
		//
		if( dwStatus == WAIT_OBJECT_0 )
		{
			//	MessageBox(0,_T("susceadl!"),_T("hgoodasdf!@"),MB_OK);
			gObj->m_bBusy=true;
			while (gObj->ADT700_ConversionDone() == 1);
			gObj->m_fGatheredVolt[gObj->m_nDataStoreIndex][gObj->m_Channel]=gObj->ADT700_ReadData();
			if(gObj->m_Channel ==0)
				WriteMsg(gObj->m_Channel,gObj->m_fGatheredVolt[gObj->m_nDataStoreIndex][gObj->m_Channel]);

			gObj->ADT700_ClearIRQ();     //  清除中断
			if(nPosIndex>gObj->m_Channel)
			{
				gObj->m_nDataStoreIndex++;
				gObj->m_nDataStoreIndex=gObj->m_nDataStoreIndex%GATHERNUM;
			}
			nPosIndex=gObj->m_Channel;
			InterruptDone( gObj->m_SysIntr );

			if(nPosIndex+1==CHANNELNUM&&gObj->m_nDataStoreIndex==0)
				gObj->m_bBusy =false;
			else
				gObj->ADT700_StartConversion ();
//			WriteMsg(gObj->m_Channel ,gObj->m_nDataStoreIndex ,gObj->m_fGatheredVolt[gObj->m_nDataStoreIndex][gObj->m_Channel]);
		}
	}

  return 0;
}

void CADT700_Impl::WriteErrorMsg()
{
	return;
	FILE *fp;
	fp=fopen("\\error.txt","ab+");
	if(fp==0)
		return;
	char str[20];
	memset(str,0,20);
	sprintf(str,"Error:%d\r\n",ErrorCode);
	fputs(str,fp);
	fclose(fp);
}

CADT700_Impl::CADT700_Impl()
{
	m_fIsMapped=FALSE;
	m_fRun=FALSE;
	m_hISTInterruptEvent=0;
	m_SysIntr=0;
	m_Channel=0;
	m_VoltageRange=10;
	m_ConversionFactor=0;
	m_Baseline=0;
	m_nUseNumber=0;
	m_BaseAddr=0;
	memset(m_fGatheredVolt,0,sizeof(float)*GATHERNUM*CHANNELNUM);  //存储采集到的数据
	m_nDataStoreIndex=0;  //the position index of data store
	ErrorCode=0;
	for(int i=0;i<6;i++)
	{
		m_arrFrequency[i].fFrequency=0;
		m_arrFrequency[i].nLastNum=-1;
		m_arrFrequency[i].nLastTime=-1;
		m_arrFrequency[i].nMaxCounter=65535;
	}

	m_bBusy=false;
	m_nTimerID=-1;
}

CADT700_Impl::~CADT700_Impl()
{

}



HANDLE CADT700_Impl::ADT700_DevLoad()
{
	ErrorCode=1000;
	WriteErrorMsg();
	if(m_nUseNumber>0)
	{
		ErrorCode=100;
		WriteErrorMsg();
		return m_BaseAddr;
	}

	m_nDataStoreIndex=0;

	HANDLE hReAddress=INVALID_HANDLE_VALUE;
	DWORD IrqResource,dwBaseAddress;
	WCHAR IsrDllName[20],IsrFunName[20];
	DWORD dwStatus, dwSize, dwValue, dwType;

	memset(IsrDllName,0,sizeof(WCHAR)*20);
	memset(IsrFunName,0,sizeof(WCHAR)*20);

	HKEY hk;
	dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Drivers\\IOCards\\ADT700"), 0, 0, &hk);
	if(dwStatus == ERROR_SUCCESS) 
	{
		dwSize = sizeof(dwValue);
		//Read m_SysIntr value
		dwStatus = RegQueryValueEx(hk, _T("SysIntr"), NULL, &dwType, (LPBYTE) &dwValue, &dwSize);
		if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD)
		{
			m_SysIntr = dwValue;
		}
		else
		{
			RegCloseKey(hk);
			ErrorCode=1;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}

		//read Irq
		dwStatus = RegQueryValueEx(hk, _T("IrqResource"), NULL, &dwType, (LPBYTE) &dwValue, &dwSize);
		if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) 
		{
			IrqResource = dwValue;
		}
		else
		{
			RegCloseKey(hk);
			ErrorCode=2;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}

		//read baseaddress
		dwStatus = RegQueryValueEx(hk, _T("BaseAddr"), NULL, &dwType, (LPBYTE) &dwValue, &dwSize);
		if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) 
		{
			dwBaseAddress = dwValue;
			ErrorCode=dwBaseAddress;
			WriteErrorMsg();
		}
		else
		{
			ErrorCode=3;
			RegCloseKey(hk);
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		//read IsrDllName
		dwSize=20*sizeof(WCHAR);
		dwStatus = RegQueryValueEx(hk, _T("IsrDllName"), NULL, &dwType, (LPBYTE) &IsrDllName, &dwSize);
		if(dwStatus == ERROR_SUCCESS && dwType == REG_SZ) ;
		else
		{
			RegCloseKey(hk);
			ErrorCode=dwStatus;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}

		//read IsrFunName
		dwSize=20*sizeof(WCHAR);
		dwStatus = RegQueryValueEx(hk, _T("IsrFunName"), NULL, &dwType, (LPBYTE) &IsrFunName, &dwSize);
		if(dwStatus == ERROR_SUCCESS && dwType == REG_SZ);
		else
		{
			RegCloseKey(hk);
			ErrorCode=dwStatus;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		RegCloseKey(hk);

		//
		HANDLE  hHandle=LoadIntChainHandler(IsrDllName,IsrFunName,IrqResource);
		if(hHandle==NULL||hHandle==INVALID_HANDLE_VALUE)
		{
			ErrorCode=14;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		
		GIISR_INFO Info;
		memset(&Info,0,sizeof(GIISR_INFO));
		PVOID dwPhysAddr=0;
		DWORD inIoSpace = 1;    // io space
		PHYSICAL_ADDRESS PortAddress  = {dwBaseAddress, 0};
		
		if (!TransBusAddrToStatic(Isa, 0, PortAddress, sizeof(DWORD), &inIoSpace, &dwPhysAddr)) 
		{
			ErrorCode=13;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		if(KernelIoControl( IOCTL_HAL_REQUEST_SYSINTR,
                &IrqResource,
                sizeof(IrqResource),
                &m_SysIntr,
                sizeof(m_SysIntr),
                NULL )==FALSE)
		{
			ErrorCode=6;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		
		// Set up ISR handler
		Info.SysIntr = m_SysIntr;
		Info.CheckPort = TRUE;
		Info.PortIsIO = TRUE;
		Info.UseMaskReg = FALSE;
		Info.PortAddr = (DWORD)((PUCHAR)dwPhysAddr+ENABLE_IRQ);
		Info.PortSize = sizeof(BYTE);
		Info.Mask = 0x4;

        
		if (!KernelLibIoControl(hHandle, IOCTL_GIISR_INFO, &Info, sizeof(Info), NULL, 0, NULL)) 
		{
			KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR,
                &m_SysIntr,
                sizeof(m_SysIntr),
                NULL,
                0,
                NULL );
		//	MessageBox(0,_T("KernelLibIoControl error"),_T("sdrlsadf"),MB_OK);
			ErrorCode=7;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		//
		// Translate IO address 
		//
		ULONG fInIoSpace = TRUE;	// io space  
		PHYSICAL_ADDRESS MappedAddress;
		if ( ! HalTranslateBusAddress( Isa, 0, PortAddress, &fInIoSpace, &MappedAddress)) 
		{
			//	MessageBox(0,_T("HalTranslateBusAddress error"),_T("sdrlsadf"),MB_OK);
			KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR,
                &m_SysIntr,
                sizeof(m_SysIntr),
                NULL,
                0,
                NULL );
			ErrorCode=8;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		
		if ( fInIoSpace )
		{
			hReAddress = (HANDLE) MappedAddress.LowPart;
			m_fIsMapped = FALSE;
		}
		else 
		{
			hReAddress = (HANDLE) MmMapIoSpace(MappedAddress, 0xFF, FALSE);
			m_fIsMapped = TRUE;
		}
		
		m_fRun=TRUE;
		m_hISTInterruptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
		if (m_hISTInterruptEvent == NULL)
		{	
			//MessageBox(0,_T("CreateEvent error"),_T("sdrlsadf"),MB_OK);
			KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR,
							&m_SysIntr,
							sizeof(m_SysIntr),
							NULL,
							0,
							NULL );
			ErrorCode=9;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		
		DWORD dwThreadID;
		HANDLE g_htIST      = CreateThread(NULL,  // Security
			0,     // No Stack Size
			ThreadIST,  // Interrupt Thread                
			(LPVOID)this,    // No Parameters
			CREATE_SUSPENDED, // Create Suspended
			&dwThreadID  // Thread Id
			);
		// Set the thread priority – arbitrarily 5
		//
		int nISTPriority = 5;
		if( !CeSetThreadPriority( g_htIST, nISTPriority ))
		{
			KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR,
										&m_SysIntr,
										sizeof(m_SysIntr),
										NULL,
										0,
										NULL );
			//MessageBox(0,_T("CeSetThreadPriority error"),_T("sdrlsadf"),MB_OK);
			ErrorCode=10;
			WriteErrorMsg();
			return INVALID_HANDLE_VALUE;
		}
		
		if (!InterruptInitialize(m_SysIntr, m_hISTInterruptEvent, NULL, NULL) )
		{
		//	MessageBox(0,_T("InterruptInitialize error"),_T("sdrlsadf"),MB_OK);
			KernelIoControl( IOCTL_HAL_RELEASE_SYSINTR,
							&m_SysIntr,
							sizeof(m_SysIntr),
							NULL,
							0,
							NULL );

⌨️ 快捷键说明

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