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

📄 lcitemnode.cpp

📁 使用器件TI DSP TMS320C5402
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// LCItemNode.cpp: implementation of the LCItemNode class.
// Write by Lidd, 2002-12-08
// Modified by ZhaoPeng
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "LCItemNode.h"

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

extern LCItemNode	g_aItemsList[G_MLIST_NUM];

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

LCItemNode::LCItemNode()
{
	m_hNetThread	 = NULL;
	m_hReadThread	 = NULL;
	m_hReadThread	 = 0;


	m_iCurPage		 = 0;

	// Class state
	m_byState	 	 = ITEM_STATE_NONE;
	m_fpCurFile		 = NULL;
	m_fpCurLink		 = NULL;
	m_bFileEnd		 = FALSE;
	m_byCurType		 = 0;
	m_iSpeedFlag	 = 0;

	// Receive buffer initial
	m_wsaRecvBuf.len = NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN;
	m_wsaRecvBuf.buf = m_byBuf;
	m_dwRecvBytes	 = 0;
	m_fpRecFile		 = NULL;	

	// Send buffer initial
	m_pSendBuf1 = m_sendbuf1;
	m_pSendBuf2 = m_sendbuf2;
	m_iCurPointer   = 0;
	m_bNeedPCMStart = FALSE;

	// Command initial.
	m_byComm			= DN_COMM_TYPE_NONE;
	m_byType			= 0;
	m_byPara[0]			= 0;
	m_byPara[1]			= 0;

	m_iCurLink[0]		= 0;
	m_iCurLink[1]		= 0;
	m_byReadLink		= ITEM_LINK_NONE;


}

LCItemNode::~LCItemNode()
{
	StopServer();

	if(m_fpCurFile != NULL)fclose(m_fpCurFile);	
	if(m_fpCurLink != NULL)fclose(m_fpCurLink);

	if(m_fpRecFile != NULL)fclose(m_fpRecFile);
}

///////////////////////////////////////////////////////////////////////
// Socket monitor thread
DWORD WINAPI ProcessItemIO(LPVOID lpParameter)
{
	WSANETWORKEVENTS	NetworkEvents;
	DWORD dwEvent;
	int err;

	LCItemNode* pThis = (LCItemNode*)lpParameter;
	WSAEVENT m_EventArray = pThis->m_EventArray;
	SOCKET   m_soListen   = pThis->m_soListen;

	while(TRUE)
	{
		// Waiting for event happen
		dwEvent = WSAWaitForMultipleEvents(1, &m_EventArray, FALSE,
			WSA_INFINITE, FALSE);
		if (dwEvent == WSA_WAIT_FAILED)
		{
			AfxMessageBox("WSAWait for multiple events failed!");
			return FALSE;
		}
		
		// Get event
		err = WSAEnumNetworkEvents(m_soListen, m_EventArray, &NetworkEvents);
		if (err == SOCKET_ERROR)
		{
			AfxMessageBox("WSAEnumNetworkEvents failed!");
			return FALSE;
		}
		
		// Read data
		if (NetworkEvents.lNetworkEvents & FD_READ)
		{
			if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
			{
				TRACE("\n FD_READ failed with error %d\n", NetworkEvents.iErrorCode[FD_READ_BIT]);
				continue; 
			}

			//TRACE("\n Read the Socket %d", dwEvent);
			pThis->OnReadData(dwEvent);
			continue;			
		}

		// Write data
		if(NetworkEvents.lNetworkEvents & FD_WRITE)
		{
			if (NetworkEvents.iErrorCode[FD_WRITE_BIT] != 0)
			{
				TRACE("FD_WRITE failed with error %d\n", NetworkEvents.iErrorCode[FD_WRITE_BIT]);
				continue;
			}

//			OnWriteData(dwEvent);
			continue;
		}
	}
	
	return TRUE;
}

// Associate thread, used for read data from file
DWORD WINAPI ProcessReadFile(LPVOID lpParameter)
{
	LCItemNode* pThis;
	MSG msg;
	DWORD dwTemp;
	int iNumber;
	
	// Main message loop:
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		switch(msg.message)
		{
		case SOCKET_READ_FILE:
			iNumber = (int)msg.wParam;
			if(iNumber < 0 || iNumber >= G_MLIST_NUM)break;
			pThis = &(g_aItemsList[iNumber]);

			// No file is opened
			if(pThis->m_fpCurFile == NULL)
				break;				
			
			// Now, we are do step oprate!
//			if(pThis->m_iSpeedFlag != 0)
//				break;
		
			// Read some data from file
			memset(pThis->m_pSendBuf2 + NET_DATA_FRAME_HEADLEN, 0, 
				sizeof(BYTE) * NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS);
			dwTemp = fread(pThis->m_pSendBuf2 + NET_DATA_FRAME_HEADLEN, sizeof(BYTE), 
				NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS, pThis->m_fpCurFile);
			if(dwTemp < NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS)
			{
				//pThis->m_bFileEnd = TRUE;
				//if(pThis->m_fpCurFile == NULL)break;
				fseek(pThis->m_fpCurFile, 0, SEEK_SET);
			}

			if(pThis->m_byReadLink == ITEM_LINK_NEEDREAD)
			{
				fseek(pThis->m_fpCurLink, 4 * sizeof(BYTE) + 4 * sizeof(int), SEEK_SET);
				for(;;)
				{
					dwTemp = fread(pThis->m_iCurLink, sizeof(int), 2, pThis->m_fpCurLink);
					if(dwTemp < 2)
					{
						break;
					}
					double dbTempLink = pThis->m_iCurLink[1];
					dbTempLink = dbTempLink / 1000 + pThis->m_iCurLink[0];
					dbTempLink *= 21.6;

					if(dbTempLink < pThis->m_dCurPlay)
						fseek(pThis->m_fpCurLink, pThis->m_iLinkParam[1], SEEK_CUR);
					else
					{
						break;
					}
				}

				dwTemp = fread(pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, sizeof(BYTE), 
					pThis->m_iLinkParam[1], pThis->m_fpCurLink);
				if(dwTemp < (DWORD)pThis->m_iLinkParam[1])
				{
					pThis->m_byReadLink = ITEM_LINK_READSTOP;
					break;
				}
				BYTE* pPointer = pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN + BMP_MAX_SANQU * 2352;
				memcpy(pPointer, pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, BMP_MAX_SANQU * 2352);
				pPointer += BMP_MAX_SANQU * 2352;
				memcpy(pPointer, pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, BMP_MAX_SANQU * 2352);
				pPointer += BMP_MAX_SANQU * 2352;
				memcpy(pPointer, pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, BMP_MAX_SANQU * 2352);

				pThis->m_byReadLink = ITEM_LINK_HAVEREAD;
				pThis->m_uMenuPointer = NET_DATA_FRAME_HEADLEN;
				pThis->m_uMenuFrames  = 0;
			}

			
			if(pThis->m_byReadLink==ITEM_LINK_SET)
			{

				if(!fseek(pThis->m_fpCurLink, 4 * sizeof(BYTE) + 4 * sizeof(int) + sizeof(int)*2+pThis->m_iLinkParam[1]*pThis->m_iCurPage, SEEK_SET))
					break;

				dwTemp = fread(pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, sizeof(BYTE), 
					pThis->m_iLinkParam[1], pThis->m_fpCurLink);
				if(dwTemp < (DWORD)pThis->m_iLinkParam[1])
				{
					pThis->m_byReadLink = ITEM_LINK_READSTOP;
					break;
				}
				BYTE* pPointer = pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN + BMP_MAX_SANQU * 2352;
				memcpy(pPointer, pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, BMP_MAX_SANQU * 2352);
				pPointer += BMP_MAX_SANQU * 2352;
				memcpy(pPointer, pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, BMP_MAX_SANQU * 2352);
				pPointer += BMP_MAX_SANQU * 2352;
				memcpy(pPointer, pThis->m_sendbufMenu + NET_DATA_FRAME_HEADLEN, BMP_MAX_SANQU * 2352);

				pThis->m_byReadLink = ITEM_LINK_HAVEREAD;
				pThis->m_uMenuPointer = NET_DATA_FRAME_HEADLEN;
				pThis->m_uMenuFrames  = 0;
			}

			break;

		default:
			break;
		}	
	}
	
	return 0;
}

/////////////////////////////////////////////////////////
BOOL LCItemNode::ServerSocketInit(UINT uPort)
{
	WORD				wVersionRequested;
	WSADATA				wsaData;
	int					err;
 
	wVersionRequested = MAKEWORD( 2, 2 );
	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		AfxMessageBox("Can't find a usable WinSock DLL!");
		return FALSE;
	}
	if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) 
	{
		AfxMessageBox("Can't find a usable WinSock DLL!");
		WSACleanup();
		return FALSE;
	}

	if ((m_soSend = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
	{
		AfxMessageBox("Create listen socket failed!");
		return FALSE;
	}

	SOCKADDR_IN	socRemote;
	socRemote.sin_family = AF_INET;
	if ((m_soListen = socket (AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
	{
		AfxMessageBox("Create listen socket failed!");
		return FALSE;
	}

	if ((m_EventArray = WSACreateEvent()) == WSA_INVALID_EVENT)
	{
		AfxMessageBox("WSACreateEvent() failed!");
		return FALSE;
	}		
	err = WSAEventSelect(m_soListen, m_EventArray, FD_READ|FD_WRITE);
	if ( err == SOCKET_ERROR)
	{
		AfxMessageBox("Select WSASocket event failed!");
		return FALSE;
	}

	SOCKADDR_IN			socLocal;
	socLocal.sin_family = AF_INET;
	socLocal.sin_addr.s_addr = htonl(INADDR_ANY);
	socLocal.sin_port = htons(uPort);
	err = bind(m_soListen, (PSOCKADDR)&socLocal, sizeof(socLocal));
	if (err == SOCKET_ERROR)
	{
		AfxMessageBox("Bind Socket failed!");
		return FALSE;
	}

	m_iPlayFlag		 = 0;
	m_iSpeedFlag	 = 0;

	DWORD ThreadId;
	m_hReadThread = CreateThread(NULL, 0, ProcessReadFile, (LPVOID)this, 0, &m_dwReadThreadID);
	if(m_hReadThread == NULL)
	{
		TRACE("CreateThread failed with error %d\n", GetLastError());
		return FALSE;
	}
	
	//=:) Debug codes!!
//	ChangeMenuPage(0,0);
	//=:) End here!
	if(strIP!="192.168.1.65")goto aa;
test1();
Sleep(200);
test2();
Sleep(200);
test1();
Sleep(200);
test2();
Sleep(200);
aa:

	

	m_hNetThread = CreateThread(NULL, 0, ProcessItemIO, (LPVOID)this, 0, &ThreadId);
	if(m_hNetThread == NULL)
	{
		TRACE("CreateThread failed with error %d\n", GetLastError());
		return FALSE;
	}
	
	return TRUE;
}

BOOL LCItemNode::StopServer(void)
{
	if(m_byState == ITEM_STATE_RUN)
	{
		// Close socket
		closesocket(m_soSend);
		closesocket(m_soListen);

		// Close event
		WSACloseEvent(m_EventArray);

   		TerminateThread(m_hNetThread, 1);
		m_hNetThread = NULL;

		TerminateThread(m_hReadThread, 1);		
		m_hReadThread = NULL;

		m_byState = ITEM_STATE_NORMAL;
	}

	// Close old file
	if(m_fpCurFile != NULL)
	{
		fclose(m_fpCurFile);
		m_fpCurFile = NULL;
	}
	if(m_fpCurLink != NULL)
	{
		fclose(m_fpCurLink);
		m_fpCurLink = NULL;
	}

	return TRUE;
}


BOOL LCItemNode::OnReadData(DWORD dwEvent)
{
	DWORD dwFlags = 0;
	int err;
	
	WSARecv(m_soListen, &m_wsaRecvBuf, 1, &m_dwRecvBytes,	&dwFlags, NULL, NULL);
	
	err = WSAGetLastError();
	if(err == NO_ERROR)		// Read is OK
	{
		BYTE byComm = m_byBuf[1];
		if(byComm == UP_COMM_REQU && m_iPlayFlag == 1)//&& m_iEnableFlag == 1)		// Request data.
 			SendDataToItem();
		else if(byComm == UP_COMM_RECORD_DATA)
		{
			if(m_fpRecFile != NULL && m_dwRecvBytes > NET_DATA_FRAME_HEADLEN)
				fwrite(m_byBuf + NET_DATA_FRAME_HEADLEN, sizeof(BYTE), 
					m_dwRecvBytes - NET_DATA_FRAME_HEADLEN, m_fpRecFile);
		}
		return TRUE;
	}
	// Socket blocks!
	else if (err == WSAEWOULDBLOCK)
	{
		TRACE("\n WSARecv() Blocked in Socket %d", dwEvent);
		return FALSE;
	}
	// Socket Unknown errors!
	else
	{
		TRACE("\n WSARecv() failed with error %d", WSAGetLastError());
		return FALSE;
	}
}

BOOL LCItemNode::ProcessCommand()
{
	// Get the command
	m_byBuf[0]=m_byBuf[0];
	BYTE byComm = m_byBuf[0];
	BYTE byArrt = m_byBuf[1];
	BYTE byTerm = m_byBuf[2];
	BYTE byPara = m_byBuf[3];

	char strFileName[1024];
	char strLinkFile[1024];

	FILE* tempfp;

	// Deal the command
	switch(byComm)
	{
	case COMM_TYPE_DISABLE:
		m_iPlayFlag=0;
		break;
	case COMM_TYPE_PAGETO:
//		Sleep(1);
		ShowMenuPage(byArrt);
	//	ShowMenuPage(byArrt);
		break;
	case COMM_TYPE_BC:
		m_iBC=1;
		break;
	case COMM_TYPE_STOPBC:
		m_iBC=0;
		break;

	case COMM_TYPE_OPEN:		// Open file control
		m_iBC=0;

		// Open new file...
//		sscanf(m_byBuf + 4, "%s", strFileName);
		sscanf(FileNameBuf, "%s", strFileName);
		if(strFileName == "")break;

		tempfp = fopen(strFileName, "rb");
		if(tempfp == NULL)break;

		// Close old file		
		m_iPlayFlag	= 0;
		SendCommToItem(DN_COMM_TYPE_FROOZE, 0);
		SendCommToItem(DN_COMM_TYPE_CLEAR, 0);
		SendCommToItem(DN_COMM_TYPE_FROOZE, 0);



		if(m_fpRecFile != NULL)
		{
			fclose(m_fpRecFile);
			m_fpRecFile = NULL;
		}

		if(m_fpCurFile != NULL)
		{
			fclose(m_fpCurFile);
			m_fpCurFile = NULL;
		}

		if(m_fpCurLink != NULL)
		{
			fclose(m_fpCurLink);
			m_fpCurLink = NULL;
		}		

		m_fpCurFile = tempfp;

		fseek(m_fpCurFile, 0, SEEK_SET);
		m_byComm	= DN_COMM_TYPE_DATA;
		m_byType	= byArrt;
		m_byPara[0]	= 0;
		m_byPara[1]	= 0;
		m_byCurType = byArrt;

		// Now, remember we have selected a NEW file
		m_bFileEnd		= FALSE;
		m_dCurPlay		= 0;
		m_iSpeedFlag	= 0;				
		
		m_byReadLink = ITEM_LINK_NONE;
		if(m_byCurType == COMM_ARRT_MIX)	// Need link file.
		{
			AfxMessageBox("本窗口你不该看到的:A");
			sscanf(m_byBuf + 4 + byPara + 1, "%s", strLinkFile);			
			if(strLinkFile != "")
			{
				m_bNeedPCMStart = TRUE;
				m_fpCurLink = fopen(strLinkFile, "rb");
				if(m_fpCurLink != NULL)
				{
					fseek(m_fpCurLink, 0, SEEK_SET);
					BYTE byHeader[4];
					fread(byHeader, sizeof(BYTE), 4, m_fpCurLink);
					fread(m_iLinkParam, sizeof(int), 4, m_fpCurLink);
					m_byReadLink = ITEM_LINK_NEEDREAD;
					m_byComm = DN_COMM_TYPE_MIX;
				}
			}
		}			 

		if(m_byCurType == COMM_ARRT_MENU||m_byCurType == COMM_ARRT_TXT)	
		{

			memset(strFileName,0,1024*sizeof(BYTE));
			sscanf(m_byBuf + 4 + byPara + 1, "%s", strFileName);
			sscanf(m_byBuf + 4, "%s", strLinkFile);
			m_fpCurLink=m_fpCurFile;

//				Sleep(1000);
				ShowMenuPage(0);
				ShowMenuPage(0);
				ShowMenuPage(0);
//				Sleep(100);
		

			m_fpCurFile=0;
			if(strFileName[0])
			m_fpCurFile=fopen(strFileName, "rb");
			AfxMessageBox("本窗口你不该看到的:B");
			m_byComm=DN_COMM_TYPE_MENU;
			m_iMenuMode=MENU_MODE_TXT;
		}



		memset(m_pSendBuf2 + NET_DATA_FRAME_HEADLEN, 0, 
			sizeof(BYTE) * NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS);
		if(m_fpCurFile)
		fread(m_pSendBuf2 + NET_DATA_FRAME_HEADLEN, sizeof(BYTE), 
			NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS, m_fpCurFile);		

		m_iCurPointer   = 0;
		
		//if(!PostThreadMessage(m_dwReadThreadID, SOCKET_READ_FILE, (WPARAM)m_iThisNumber, (LPARAM)0))
		//	TRACE("\n Can't Post Message!");	

		if(m_byCurType == COMM_ARRT_MPEG||m_byCurType == COMM_ARRT_PCM)	
		{
				Sleep(300);
				m_iPlayFlag		= 1; 
		}	

		break;

	case COMM_TYPE_CLOSE:		// Close file controlf
	case COMM_TYPE_STOP:		// Stop control
		// Stop if needed.
		m_iPlayFlag  = 0;
		m_iSpeedFlag = 0;
		m_iEnableFlag=0;
		// Clear buffer!
		SendCommToItem(DN_COMM_TYPE_FROOZE, 0);

		if(m_fpCurFile != NULL)
		{
			fclose(m_fpCurFile);
			m_fpCurFile = NULL;
		}
		if(m_fpCurLink != NULL)
		{
			fclose(m_fpCurLink);
			m_fpCurLink = NULL;
		}

		m_iPlayFlag = 0;
		SendCommToItem(DN_COMM_TYPE_FROOZE, 0);
	//	ChangeMenuPage(0,0);
		break;

	case COMM_TYPE_PLAY:		// Play control
		m_iPlayFlag = 1;
		m_iEnableFlag = 1;
		if(m_iSpeedFlag != 0)
		{
			if(m_fpCurFile == NULL)
			{
				m_iSpeedFlag = 0;
				break;
			}

			time_t	tStopTime;
			time(&tStopTime);
			long	lspan = tStopTime - m_tStartTime;
			long	lspan2;
			long    lskip = 0;

			switch(m_byCurType)
			{
			case COMM_ARRT_MPEG:
				lskip = NET_DATA_STEP_MPEG;
				break;
			case COMM_ARRT_PCM:
				lskip = NET_DATA_STEP_PCM; 
				break;
			default:
				lskip = NET_DATA_STEP_PCM;
				break;
			}
			if(m_iSpeedFlag==-1)
			{
		//		if(!fseek(m_fpCurFile, lskip * lspan, SEEK_CUR))
		//			fseek(m_fpCurFile, 0, SEEK_SET);
		
				lspan2=ftell(m_fpCurFile);
//(((
				if(lspan2>lskip * lspan)
					fseek(m_fpCurFile, lspan2-lskip * lspan, SEEK_SET);
				else
					fseek(m_fpCurFile, 0, SEEK_SET);
		
				memset(m_pSendBuf2 + NET_DATA_FRAME_HEADLEN, 0, 
					sizeof(BYTE) * NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS);
				if(m_fpCurFile)
				fread(m_pSendBuf2 + NET_DATA_FRAME_HEADLEN, sizeof(BYTE), 
					NET_DATA_FRAME_LEN * NET_DATA_SEND_FRAMES * NET_DATA_READ_BLOCKS, m_fpCurFile);		
				m_iCurPointer=0;

				SendCommToItem((char)DN_COMM_TYPE_CLEAR, 0);
			}
			//	fseek(m_fpCurFile, 0, SEEK_SET);
			
			if(m_byReadLink != ITEM_LINK_NONE)
			{

⌨️ 快捷键说明

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