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

📄 lxserverdlg.cpp

📁 使用器件TI DSP TMS320C5402
💻 CPP
字号:
// LXServerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "LXServer.h"
#include "LXServerDlg.h"

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

#include "LCItemNode.h"

LCItemNode	g_aItemsList[G_MLIST_NUM];

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLXServerDlg dialog

CLXServerDlg::CLXServerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CLXServerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CLXServerDlg)
	m_flag1 = FALSE;
	m_flag2 = FALSE;
	m_strFileName = _T("");
	m_seek = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CLXServerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLXServerDlg)
	DDX_Check(pDX, IDC_CHECK1, m_flag1);
	DDX_Check(pDX, IDC_CHECK2, m_flag2);
	DDX_Text(pDX, IDC_EDIT1, m_strFileName);
	DDX_Control(pDX, IDC_CHECK2, m_bstCK2);
	DDX_Control(pDX, IDC_CHECK1, m_bstCK1);
	DDX_Control(pDX, IDC_BTN_STOP, m_bstStop);
	DDX_Control(pDX, IDC_BTN_START, m_bstStart);
	DDX_Control(pDX, IDC_BTN_MIN, m_bstMin);
	DDX_Control(pDX, IDC_BTN_EXIT, m_bstExit);
	DDX_Text(pDX, IDC_EDIT2, m_seek);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CLXServerDlg, CDialog)
	//{{AFX_MSG_MAP(CLXServerDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_START, OnBtnStart)
	ON_BN_CLICKED(IDC_BTN_STOP, OnBtnStop)
	ON_WM_ERASEBKGND()
	ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
	ON_BN_CLICKED(IDC_CHECK1, OnCheck1)
	ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
	ON_BN_CLICKED(IDC_BTN_MIN, OnBtnMin)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLXServerDlg message handlers



extern void SetMyBtn(CButtonST &btn);

BOOL CLXServerDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	// when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// Receive buffer initial
	m_wsaRecvBuf.len = NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN;
	m_wsaRecvBuf.buf = m_byBuf;
	m_dwRecvBytes	 = 0;

	m_hNetThread	= NULL;

	// Item initial
	for(int i = 0; i < G_MLIST_NUM; i++)
	{
		g_aItemsList[i].m_iThisNumber = i;
		g_aItemsList[i].strIP.Format("192.168.1.%d", i + 1);
		g_aItemsList[i].uPort = 9900 + i + 1;
		g_aItemsList[i].m_strRecPath.Format("c:\\FYTemp\\Recdata\\Record%d", i + 1);
		g_aItemsList[i].m_byState = ITEM_STATE_NORMAL;
	}
	m_bstStop.SetBitmaps(IDB_STOP1,RGB(0,0,0),IDB_STOP2,RGB(0,0,0));
	m_bstStart.SetBitmaps(IDB_START1,RGB(0,0,0),IDB_START2,RGB(0,0,0));
	m_bstMin.SetBitmaps(IDB_MIN1,RGB(0,0,0),IDB_MIN2,RGB(0,0,0));
	m_bstExit.SetBitmaps(IDB_EXIT1,RGB(0,0,0),IDB_EXIT2,RGB(0,0,0));

	m_bstCK1.SetBitmaps(IDB_START1,RGB(0,0,0),IDB_START2,RGB(0,0,0));
	m_bstCK2.SetBitmaps(IDB_STOP1,RGB(0,0,0),IDB_STOP2,RGB(0,0,0));

	SetMyBtn(m_bstStop);
	SetMyBtn(m_bstStart);
	SetMyBtn(m_bstMin);
	SetMyBtn(m_bstExit);

	SetMyBtn(m_bstCK1);
	SetMyBtn(m_bstCK2);

	m_flag1=1;
	m_flag2=0;
	UpdateData(false);	

/*
	m_bstStop.;
	m_bstStart;
	m_bstMin;
	m_bstExit;


*/	OnBtnStart();
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CLXServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CLXServerDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CLXServerDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CLXServerDlg::OnBtnStart() 
{
	ServerSocketInit(9801);

	for(UINT i = 0; i < G_MLIST_NUM; i++)
	{
		if(g_aItemsList[i].m_byState == ITEM_STATE_NORMAL)
		{
			if(g_aItemsList[i].ServerSocketInit(g_aItemsList[i].uPort))
				g_aItemsList[i].m_byState = ITEM_STATE_RUN; 
		}
	}
}

void CLXServerDlg::OnBtnStop() 
{
	for(UINT i = 0; i < G_MLIST_NUM; i++)
		g_aItemsList[i].StopServer();	

	// Close socket & event
	if(m_hNetThread != NULL)
	{
		closesocket(m_soListen);
		WSACloseEvent(m_EventArray);
   		TerminateThread(m_hNetThread, 1);
		m_hNetThread = NULL;
	}
}

DWORD WINAPI ProcessNetIO(LPVOID lpParameter)
{
	WSANETWORKEVENTS	NetworkEvents;
	DWORD dwEvent;
	int err;

	CLXServerDlg* pThis = (CLXServerDlg*)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;
}

BOOL CLXServerDlg::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_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;
	}

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

BOOL CLXServerDlg::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 byItem = m_byBuf[2];
		if(byItem == COMM_TERM_NONE)
			return TRUE;
		if((byItem >= G_MLIST_NUM)&&(byItem!=255)&&(byItem!=254))
			return TRUE;
		if(byItem!=255&&(byItem!=254))
		{
			memcpy(g_aItemsList[byItem].m_byBuf, m_byBuf, NET_DATA_DATA_LEN);
			g_aItemsList[byItem].ProcessCommand();
		}
		else
		{
			for(int i=0;i<G_MLIST_NUM;i++)
			{
				memcpy(g_aItemsList[i].m_byBuf, m_byBuf, NET_DATA_DATA_LEN);
				g_aItemsList[i].ProcessCommand();
			}
		}
	}
	// 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;
	}

	return TRUE;
}

void CLXServerDlg::OnOK() 
{
	OnBtnStop();
	
	CDialog::OnOK();
}

void CLXServerDlg::OnCancel() 
{
	OnBtnStop();
	
	CDialog::OnCancel();
}

BOOL CLXServerDlg::OnEraseBkgnd(CDC* pDC) 
{
	BOOL result=CDialog::OnEraseBkgnd(pDC);
/*
	CBitmap bitmap;
	bitmap.LoadBitmap(IDB_BG);
	CDC memDc;
	memDc.CreateCompatibleDC(pDC);
	memDc.SelectObject(bitmap);
	pDC->BitBlt(0,0,1000,1000,&memDc,0,0,SRCCOPY);
	memDc.DeleteDC();
*/

	return result;
}

void CLXServerDlg::OnBtnExit() 
{
	PostQuitMessage(0);
}


void SetMyBtn(CButtonST &btn)
{
	btn.SizeToContent();
	btn.SetAlign(CButtonST::ST_ALIGN_OVERLAP, TRUE);
	btn.SetPressedStyle(CButtonST::BTNST_PRESSED_LEFTRIGHT, TRUE);
	btn.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(255, 255, 255));
	btn.SetColor(CButtonST::BTNST_COLOR_FG_OUT, RGB(0, 0, 0));
	btn.DrawBorder(FALSE, TRUE);
//	btn.SetBitmaps(IDB_BACK,RGB(0,0,0),IDB_BACK,RGB(0,0,0));
}




void CLXServerDlg::OnCheck1() 
{
	if(m_flag1==0&&m_flag2==1)
	{
		m_flag1=0;
		m_flag2=1;
		UpdateData(false);	
		return;
	}

	m_flag1=0;
	m_flag2=1;
	UpdateData(false);	
	OnBtnStart();
}

void CLXServerDlg::OnCheck2() 
{
	if(m_flag1==0&&m_flag2==0)
	{
		m_flag1=1;
		m_flag2=0;
		UpdateData(false);
		return;
	}
	m_flag1=1;
	m_flag2=0;
	UpdateData(false);
	OnBtnStop();
}

void CLXServerDlg::OnBtnMin() 
{
	this->ShowWindow(SW_MINIMIZE);
}

void CLXServerDlg::OnButton4() 
{
	CFileDialog dlg(1);
	if(dlg.DoModal())
	{
		m_strFileName=dlg.GetPathName();
		UpdateData(false);
	}
}

void CLXServerDlg::OnButton1() 
{
	ServerSocketInit(9801);

	for(UINT i = 0; i < G_MLIST_NUM; i++)
	{
		if(g_aItemsList[i].m_byState == ITEM_STATE_NORMAL)
		{
			if(g_aItemsList[i].ServerSocketInit(g_aItemsList[i].uPort))
				g_aItemsList[i].m_byState = ITEM_STATE_RUN; 
		}
	}	
}

void CLXServerDlg::OnButton2() 
{
	for(UINT i = 0; i < G_MLIST_NUM; i++)
		g_aItemsList[i].StopServer();	

	// Close socket & event
	if(m_hNetThread != NULL)
	{
		closesocket(m_soListen);
		WSACloseEvent(m_EventArray);
   		TerminateThread(m_hNetThread, 1);
		m_hNetThread = NULL;
	}	
}

void CLXServerDlg::OnButton3() 
{
	char buffer[NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN];
	memset(buffer,0,NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN);
	
	buffer[0]=(char)COMM_TYPE_OPEN;
	buffer[1]=(char)COMM_ARRT_MPEG;

	memcpy(g_aItemsList[0].FileNameBuf,m_strFileName.GetBuffer(0),m_strFileName.GetLength());
	memcpy(g_aItemsList[0].m_byBuf,buffer,NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN);
	g_aItemsList[0].ProcessCommand();
}

void CLXServerDlg::OnButton5() 
{
	UpdateData();

	char buffer[NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN];
	memset(buffer,0,NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN);
	
	buffer[0]=(char)COMM_TYPE_SEEK;
	buffer[1]=(char)COMM_ARRT_MPEG;

	buffer[4]=(char)m_seek/10/256;
	buffer[5]=(char)(m_seek/10)%256;
	buffer[6]=(char)m_seek%10*100/256;
	buffer[7]=(char)(m_seek%10*100)%256;
	

	memcpy(g_aItemsList[0].m_byBuf,buffer,NET_DATA_FRAME_LEN + NET_DATA_FRAME_HEADLEN);
	g_aItemsList[0].ProcessCommand();
}

⌨️ 快捷键说明

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