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

📄 nodesetdlg.cpp

📁 实现了无线传感器网络中的一个路由协议算法。
💻 CPP
字号:
// NodeSetDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GlobalClass.h"
#include "SimSensor.h"
#include "MainFrm.h"
#include "SimSensorView.h"
#include "Node.h"
#include "Sink.h"
#include "Msg.h"
#include "MsgCenter.h"
#include "Draw.h"
#include "NodeSetDlg.h"


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

extern CMsgCenter MsgCenter;
extern CDraw Draw;
/////////////////////////////////////////////////////////////////////////////
// CNodeSetDlg dialog


CNodeSetDlg::CNodeSetDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CNodeSetDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNodeSetDlg)
	m_NodeNum = 100;
	m_Radium = 100.0f;
	m_NodeEnergy = 100.0;
	//}}AFX_DATA_INIT
}


void CNodeSetDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNodeSetDlg)
	DDX_Text(pDX, IDC_NODE_NUM, m_NodeNum);
	DDX_Text(pDX, IDC_RADIUM, m_Radium);
	DDX_Text(pDX, IDC_NODE_ENERGY, m_NodeEnergy);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNodeSetDlg, CDialog)
	//{{AFX_MSG_MAP(CNodeSetDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNodeSetDlg message handlers

void CNodeSetDlg::OnOK() 
{
	// TODO: Add extra validation here
	int i,j;
	UpdateData (true);
	g_Radium = m_Radium;	 
	g_NodeNum = m_NodeNum;
	g_NodeEnergy = m_NodeEnergy;

	CSink::SinkEnd = FALSE;
	CNode::NodeEnd = FALSE;


    
	//动态申请二维数组保存各区间的传感器
    DYNAMIC_2D_ARRAY(MsgCenter.pNodeStrain,BONDERY + 1,9,CNodeStrain *);
    DYNAMIC_2D_ARRAY(MsgCenter.Locked,BONDERY + 1,9,CRITICAL_SECTION);
    
    for (i=0;i<=BONDERY;i++) {
		for (j=0;j<=8;j++) {
			MsgCenter.pNodeStrain[i][j]=NULL;
			InitializeCriticalSection(&(MsgCenter.Locked[i][j]));
		}
	}

	//创建Sink节点进程
	CSink * NewSink = new  CSink;
	NewSink->SinkId = 0;
	//把Sink节点插入到保存各区间传感器的数组中的pNodeStrain[0][0]
	MsgCenter.InsertNodeStrain( (CNode *)NewSink,0,0 );
    AfxBeginThread(NewSink->SinkWorkProc, NewSink,THREAD_PRIORITY_NORMAL);
    
	//创建Node节点进程
    for (i=1;i<=(int(g_NodeNum/8)+1);i++) {
        int Num=((i*8<=g_NodeNum)?8:g_NodeNum%8);
		for (j=1;j<=Num;j++) {
			CNode * NewNode = new  CNode(m_NodeEnergy);
			
			//产生随机数(浮点数),位于区间[a,b]或者[b,a]
			//double randDbl(double a,double b)
			//{
			//	return a + static_cast<double>(rand())/RAND_MAX*(b-a);
			//}
			NewNode->Distance = (i-1)*g_Radium/(int(g_NodeNum/8)+1)+static_cast<double>(rand())/RAND_MAX*(g_Radium/(int(g_NodeNum/8)+1));
			NewNode->Angle  = (j-1)*PAI/4 + static_cast<double>(rand())/RAND_MAX*(PAI/4);
			NewNode->NodeId = (i-1)*8+j; 
			
			//把Node节点插入到保存各区间传感器的数组的pNodeStrain[0][1]传感器链中
			MsgCenter.InsertNodeStrain( NewNode,0,1 );
		    AfxBeginThread(NewNode->NodeWorkProc, NewNode,THREAD_PRIORITY_NORMAL);
			//NewNode->hThread = CreateThread(NULL,0,NewNode->NodeWorkProc,(LPVOID)(&NewNode),0,NULL);
		}
	}
    g_Num = 0;

	//向Sink节点发送消息让系统进入初始化过程
	MsgCenter.SendMsg(0,0,-1,-1,50,NULL,-1);
    g_NodeSet = true;
    CSimSensorView *pView;
	pView = (CSimSensorView *)((CMainFrame *)AfxGetApp()->m_pMainWnd)->GetActiveView();
	CListCtrl &ListCtrl = pView->GetDocument()->pMsgListView->GetListCtrl();
	ListCtrl.DeleteAllItems(); 
	ASSERT(ListCtrl.GetItemCount() == 0);

	pView->Invalidate ();
	pView->OnDraw(pView->GetDC()); 
	pView->ReleaseDC(pView->GetDC()); 
	//Draw.DrawCoordinates(((CSimSensorView *)((CMainFrame *)AfxGetApp()->m_pMainWnd)->GetActiveView())->GetDC());
	CDialog::OnOK();
}

⌨️ 快捷键说明

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