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

📄 device.cpp

📁 基于Nuleus操作系统和s3c4510的编写的EFC。已经包含了该EFC的设计说明。这是个实际产品的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:

// sets the interval minor alarm upgrades to major alarm.
void CDevice::SetMinorUpgrade(DWORD dwSeconds)
{ 
	m_dwMinorUpgrade = dwSeconds;
//	GetApp()->SetModifiedFlag();
}

// sets the loopback timeout value
void CDevice::SetLoopbackTime(UINT nLoopbackTime)
{
	m_nLoopbackTime = nLoopbackTime;
//	GetApp()->SetModifiedFlag();
}

// initializes the device
BOOL CDevice::OnInitDevice()
{
	// 1s timer (used for RUNLED mainly)
	VERIFY(CreateTimer("RunTimer", TIMER_DEVICE_1S, 1000, 10));

	if (m_bACO)
	{
		// 400ms timer (used for ACO mainly)
		VERIFY(CreateTimer("ACOTimer", TIMER_DEVICE_400MS, 400, 10));
	}

	// Comment by Bozhong Xu
//	VERIFY(CreateTask("NetSelfTestTask", (PFNTASK)&CDevice::NetSelfTestTask, 0));

	return TRUE;
}

// Create a timer to reset watchdog.
BOOL CDevice::OnWatchdogTimer()
{
	VERIFY(CreateTimer("WatchdogTimer", TIMER_DEVICE_300MS, 300, 10));
	return TRUE;
}

// create a new CBoard object.
CBoard* CDevice::OnCreateBoard(WORD wType)
{
	CBoard* pcbBoard = new CBoard();
	ASSERT(pcbBoard);
	pcbBoard->SetType(wType);
	return pcbBoard;
}

// load parameters
void CDevice::OnLoadData()
{
	if (GetApp()->IsSubSystem())
		return;
	
	LOAD_STRING(m_diInfo.strName);
	LOAD_INT(m_diInfo.aAddr.uGroup);
	LOAD_INT(m_diInfo.aAddr.uAddrH);
	LOAD_INT(m_diInfo.aAddr.uAddrL);
	LOAD_STRING(m_diInfo.strProducer);
	LOAD_STRING(m_diInfo.strSerial);
	LOAD_INT(m_diInfo.dMadeDate.wYear);
	LOAD_INT(m_diInfo.dMadeDate.uMonth);
	LOAD_INT(m_diInfo.dMadeDate.uDay);
	SetDeviceInfo(m_diInfo);

	// load net device parameters
	NETDEVICE ndDevice = m_ndDevice;
	LOAD_STRING(m_ndDevice.strName);
	LOAD_BINARY(m_ndDevice.auIP, 4);
	LOAD_BINARY(m_ndDevice.auSubnet, 4);
	LOAD_BINARY(m_ndDevice.auGateway, 4);
	LOAD_BINARY(m_ndDevice.auMac, 6);
	LOAD_INT(m_ndDevice.nPort);
	if (ndDevice.strName.IsEmpty())
	{// insure initialize net device once. so LoadDef command don't change it
		SetNetDevice(m_ndDevice);
	}
	else
	{// restore original value
		m_ndDevice = ndDevice;
	}
/*
	////////////////////////////////////
	//add by bella yu 2004/11/5
	LOAD_INT(m_uAutoReState);
	LOAD_INT(m_wAutoReLevel);
	if( !m_wAutoReLevel )
	{	// no data read
		m_wAutoReLevel = ALARM_DEF;
	}
	
	LOAD_INT(m_addrMaster.uAddrH);
	LOAD_INT(m_addrMaster.uAddrL);
	if(!m_addrMaster.uAddrL)
	{
		m_addrMaster.uAddrL = 1;
	}
	LOAD_INT(m_addrMaster.uGroup);
	//	add by zlx 2005.5.9 for reverse
	LOAD_INT(m_reverseData.uReverseSet);
	LOAD_INT(m_reverseData.uActivePort);
	LOAD_INT(m_reverseData.uRingMaster);
	LOAD_INT(m_reverseData.uRingSlave);
	if(!m_reverseData.uRingMaster && !m_reverseData.uRingSlave)
	{
		m_reverseData.uRingSlave = 0x10;
	}
	LOAD_INT(m_reverseData.uReverseTime);
	if(!m_reverseData.uReverseTime)
	{
		m_reverseData.uReverseTime = 3;
	}
	memset(&m_reverseData.RingGuest.uCnt, 0x5A, sizeof(m_reverseData.RingGuest));
	memset(&m_reverseData.RingGuest.uCnt, 0, 1+3*REVERSE_STATION_MAX);
	LOAD_INT(m_reverseData.RingGuest.uCnt);
	LOAD_INT(m_reverseData.RingGuest.addr[0].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[1].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[2].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[3].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[4].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[5].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[6].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[7].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[8].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[9].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[10].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[11].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[12].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[13].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[14].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[15].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[16].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[17].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[18].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[19].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[20].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[21].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[22].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[23].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[24].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[25].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[26].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[27].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[28].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[29].uAddrL);
	LOAD_INT(m_reverseData.RingGuest.addr[30].uAddrL);

	// add by zlx 2005.1.26
	Flash2Ram();

	////////////////////////////////////
	// load boards
//	CString strSection;
//	WORD wBoardType, wBoardIndex;
//	for (int i = 0; ;i++) 
//	{
//		strSection.Format("Boards(%d)", i);
//		wBoardType  = GetApp()->GetProfileInt(strSection, "m_wType", -1);
//		wBoardIndex = GetApp()->GetProfileInt(strSection, "m_wIndex", i);
//		if (wBoardType == (WORD)-1)
//			break;
//		VERIFY(Install(wBoardType, wBoardIndex) != -2);
//	}
*/
}

// save parameters
void CDevice::OnSaveData()
{
	if (GetApp()->IsSubSystem())
		return;

	SAVE_STRING(m_diInfo.strName);
	SAVE_INT(m_diInfo.aAddr.uGroup);
	SAVE_INT(m_diInfo.aAddr.uAddrH);
	SAVE_INT(m_diInfo.aAddr.uAddrL);
	SAVE_STRING(m_diInfo.strProducer);
	SAVE_STRING(m_diInfo.strSerial);
	SAVE_INT(m_diInfo.dMadeDate.wYear);
	SAVE_INT(m_diInfo.dMadeDate.uMonth);
	SAVE_INT(m_diInfo.dMadeDate.uDay);

	// save net device parameters
	SAVE_STRING(m_ndDevice.strName);
	SAVE_BINARY(m_ndDevice.auIP, 4, PROFILE_BINARY_MODE_IP);
	SAVE_BINARY(m_ndDevice.auSubnet, 4, PROFILE_BINARY_MODE_IP);
	SAVE_BINARY(m_ndDevice.auGateway, 4, PROFILE_BINARY_MODE_IP);
	SAVE_BINARY(m_ndDevice.auMac, 6, PROFILE_BINARY_MODE_MAC);
	SAVE_INT(m_ndDevice.nPort);
/*
	//////////////////////////////////////////
	//add by bella yu 2004/11/5
	SAVE_INT(m_uAutoReState);
	SAVE_INT(m_wAutoReLevel);
	
	SAVE_INT(m_addrMaster.uAddrH);
	SAVE_INT(m_addrMaster.uAddrL);
	SAVE_INT(m_addrMaster.uGroup);
	///////////////////////////////////////////////////////////////////////////////
	//	add by zlx 2005.5.9 for reverse
	SAVE_INT(m_reverseData.uReverseSet);
	SAVE_INT(m_reverseData.uActivePort);
	SAVE_INT(m_reverseData.uRingMaster);
	SAVE_INT(m_reverseData.uRingSlave);
	SAVE_INT(m_reverseData.uReverseTime);
	SAVE_INT(m_reverseData.RingGuest.uCnt);
	SAVE_INT(m_reverseData.RingGuest.addr[0].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[1].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[2].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[3].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[4].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[5].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[6].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[7].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[8].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[9].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[10].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[11].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[12].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[13].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[14].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[15].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[16].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[17].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[18].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[19].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[20].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[21].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[22].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[23].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[24].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[25].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[26].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[27].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[28].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[29].uAddrL);
	SAVE_INT(m_reverseData.RingGuest.addr[30].uAddrL);
	//////////////////////////////////////////
//	POSITION pos = m_mapBoards.GetStartPosition();
//	WORD wBoard; // zero-based index of the board
//	CBoard *pcbBoard = NULL;
//	while (pos != NULL)
//	{
//		m_mapBoards.GetNextAssoc(pos, wBoard, pcbBoard);
//		ASSERT(pcbBoard);
//		pcbBoard->OnSaveData();
//	}
*/
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		wBoardType	Board type defined in the file board.h
//		wBoardIndex	Zero-based index of the specified board in the device
// Return Value:
//		Zero if installed succesfully, otherwise nonzero.
//		error code: -1	board exists, -2 failed to install board
// Remarks:
//		Install an board to the device.
int CDevice::Install(WORD wBoardType, WORD wBoardIndex)
{
	CString strSection;
	CBoard *pcbBoard = NULL;
	m_mapBoards.Lookup(wBoardIndex, pcbBoard);
	if (pcbBoard != NULL)
	{
		if (pcbBoard->GetType() == wBoardType)
		{// board exists
			return -1;
		}
		else
		{// uninstall different Board object.
			Uninstall(wBoardIndex);
		}
	}

	pcbBoard = OnCreateBoard(wBoardType);
	if (pcbBoard == NULL) 
	{// failed to create
		return -2;
	}

	pcbBoard->SetIndex(wBoardIndex);
	strSection.Format("Boards(%d)", wBoardIndex);
	pcbBoard->SetSectionString(strSection);
	pcbBoard->OnLoadData();
	VERIFY(pcbBoard->OnInitBoard());
	m_mapBoards.SetAt(wBoardIndex, pcbBoard);
	return 0;
}

///////////////////////////////////////////////////////////////////////////////
// Parameters:
//		wBoardIndex		Zero-based index of the specified board in the device.
// Remarks:
//		Uninstall an board from the device.
void CDevice::Uninstall(WORD wBoardIndex)
{
	CBoard *pcbBoard = NULL;
	m_mapBoards.Lookup(wBoardIndex, pcbBoard);
	if (pcbBoard != NULL)
		delete pcbBoard; // free memory
	m_mapBoards.RemoveKey(wBoardIndex);
}

// Check link status
void CDevice::CheckLinkStatus()
{
	if (KS5_IsLinkUp()) //	Link up	
	{	
		if (!m_byLinkStatus)
		{
			m_byLinkStatus = 1;	
#ifdef __EFC_MASTER // Added by xbz			
			GetApp()->AddEvent(LINK_STATUS, &m_byLinkStatus, 1);
#endif
		}
	}
	else //	Link down
	{	
		if (m_byLinkStatus)
		{
			m_byLinkStatus = 0;	
#ifdef __EFC_MASTER // Added by xbz			
			GetApp()->AddEvent(LINK_STATUS, &m_byLinkStatus, 1);			
#endif
		}
	}
}
/*
// Network testing
void CDevice::NetSelfTestTask(DWORD argc, void *argv)
{
	UNUSED(argc);
	UNUSED(argv);
	UINT32	preBDMA_RX_Cnt = 0;
	UINT32 	preIP_RX_Cnt;
	
	while (1) 
	{
		Test_Cnt++;
		if (m_byLinkStatus)
		{
			if(preBDMA_RX_Cnt == g_dwBdmaCnt)
			{
				BDMA_RX_Idel++;
			}
			else
			{
				BDMA_RX_Idel   = 0;
				preBDMA_RX_Cnt = g_dwBdmaCnt;
			}
			if((BDMA_RX_Idel>(BDMA_RX_MAX_IDEL/5))&&(g_dwBdmaCnt>0))
			{
				MacInit_Cnt++;
 				KS5_RecvMacInit();
				g_dwBdmaCnt		=0;
				BDMA_RX_Idel	=0;
				IP_RX_Idel		=0;
			}
			if(BDMA_RX_Idel>=120)	//10 minutes
			{
				MacInit_Cnt++;
				KS5_RecvMacInit();
				g_dwBdmaCnt		=0;
				BDMA_RX_Idel	=0;
				IP_RX_Idel		=0;
			}
			
			if(preIP_RX_Cnt == g_dwIpCnt)
			{
				IP_RX_Idel++;
			}
			else
			{
				IP_RX_Idel   = 0;
				preIP_RX_Cnt = g_dwIpCnt;
			}
			if((BDMA_RX_Idel==0)&&(IP_RX_Idel>(IP_RX_MAX_IDEL/5)))	//10 minutes
			{	//IP stack crashed,so reboot;								
//				for(i=0;i<NSOCKETS;i++)
//				{
//				    NU_Close_Socket(i);
//				}
//				Events_Add(evFOR_DEBUG,(UINT8*)"CLS");
//				NU_Sleep(TICKS_PER_SECOND<<2);
				SetNetDevice(m_ndDevice);
				StackInit_cnt++;
			}
		}
		Sleep(5000);
	}
}


// Get network status
void CDevice::GetNetStatus(BYTE *dwAddr)
{
	VPdword(dwAddr)		= g_dwBdmaCnt;
	VPdword(dwAddr+4)	= BDMA_RX_Idel;
	VPdword(dwAddr+8)	= g_dwIpCnt;
	VPdword(dwAddr+12)	= IP_RX_Idel;
	VPdword(dwAddr+16)	= VPdword(0x03FFA03C);
	VPdword(dwAddr+20)	= Test_Cnt;
	VPdword(dwAddr+24)	= MacInit_Cnt;
	VPdword(dwAddr+28)	= StackInit_cnt;

	UNUSED(dwAddr);
}
*/

// Reset/Reboot system
//
// byMode: reset mode, 0 - reset watchdog, 1 - reset application
void CDevice::Reset(BYTE byMode)
{
	if (byMode == 0) // stop watchdog restart
	{
		GetApp()->EnableWatchdog(FALSE);
	}
	else if (byMode == 1) // restart application
	{		 
		m_bReset = TRUE;		
	}
}

// Load system default configuration
//
// byMethod: operation method, reserved as 0.
void CDevice::LoadDefaultConfig(BYTE byMethod)
{
	if (byMethod == 0)
	{
		m_diInfo.Default();
//		m_ndDevice.Default();
		
		// Notify to saving
		GetApp()->SetModifiedFlag();
	}
}

⌨️ 快捷键说明

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