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

📄 netsdkdemodlg.cpp

📁 它是一个可以实时交互的嵌入式软件系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
	else
	//sun modify
	for(int j = 0; j < node.Info.byChanNum; j++)
	{
		strCh.Format("channel %02d",j+1);

		hnode1 = m_devicelist.InsertItem(strCh,0,0,hnode);
		//通道项将通道序号作为列表ID
		m_devicelist.SetItemData(hnode1,j);
	}	
	this->SetSplitByChannelNo(node.Info.byChanNum);
	this->SwitchMultiWnd(this->m_cur_channel_no);
	return 0;
}


////////////////////////////////刷新显示相关的接口函数//////////////////////////////////////////
//刷新设备列表显示,直接根据g_ptrdevicelist重新刷新显示
void CNetSDKDemoDlg::UpdateDeviceList()
{
	/*
	DeviceNode *nDev;
	HTREEITEM node, node1;
	CString strDev, strCh;	
	POSITION nPos;
	*/

	//m_devicelist.DeleteAllItems(); 

	CDevMgr::GetDevMgr().For_EachDev(UpdateDeviceListCallback, (DWORD)this);

	if (m_devicelist.GetCount() > 0)
	{
		m_devicelist.SetFocus();
	}
	/*
	nPos = g_ptrdevicelist->GetHeadPosition();
	for(int i = 0; i < g_ptrdevicelist->GetCount(); i ++ )
	{
		nDev = (DeviceNode *)g_ptrdevicelist->GetNext(nPos);

		strDev.Format(" %s (%s)<%s>",nDev->Name, nDev->IP, nDev->UserNanme);
		node = m_devicelist.InsertItem(strDev,0,0,TVI_ROOT);
		//设备项直接将设备信息指针作为列表Id
		m_devicelist.SetItemData(node,(DWORD)nDev);		

		for(int j = 0; j < nDev->Info.byChanNum; j++)
		{
			strCh.Format("channel %02d",j+1);

			node1 = m_devicelist.InsertItem(strCh,0,0,node);
			//通道项将通道序号作为列表ID
			m_devicelist.SetItemData(node1,j);
		}		
	}
	*/

}

//画面分割刷新显示
void CNetSDKDemoDlg::UpdateScreen(int nSplit)
{
	//m_screenPannel.SetShowPlayWin(nSplit, 0);
	/*
	int k;
	int spWide, spHight;    //分割大小

	CRect nRect;
	CRect subRect;

//	Invalidate();

	
	m_screenPannel.GetClientRect(&nRect);
	if (!m_bFullSCRN)
	{	
		m_screenPannel.ClientToScreen(&nRect);
		ScreenToClient(&nRect);
	}
	

	
	//处理为可以对任何画面显示在各种画面
	int nScreenStart = GetCurSplitStart(m_curScreen,nSplit);
	
	//隐藏所有画面
	for(k = 0 ; k < CUR_MAXCHAN; k++)
	{
		m_playWnd[k].ShowWindow(SW_HIDE);
	}

	//确定每个分割项大小
	spWide = nRect.Width()/nSplit;
	spHight = nRect.Height()/nSplit;

	//确定各分割项位置,并显示//CListBox
	int offsplit;
	for(int i = 0; i < nSplit; i++)
	{
		for(int j = 0; j < nSplit; j ++)
		{
			subRect.left = nRect.left + j * spWide+1;
			subRect.top = nRect.top + i * spHight+1;
			
			subRect.right = subRect.left + spWide - 1;
			subRect.bottom = subRect.top + spHight - 1;
			offsplit = nScreenStart + i * nSplit + j;

		//	m_playWnd[offsplit].ShowWindow(SW_HIDE);
			m_playWnd[offsplit].MoveWindow(&subRect,false);
		//	m_playWnd[offsplit].ShowWindow(SW_NORMAL);

			//当是当前选择分割项时,叠加显示外框
			if(offsplit == m_curScreen)
			{
				CRect rect;

				rect.left = subRect.left + 1;
				rect.top = subRect.top + 1;
				rect.right = subRect.right + 1;
				rect.bottom = subRect.bottom + 1;
				
				GetDlgItem(IDC_CURWIN)->ShowWindow(SW_HIDE);
				GetDlgItem(IDC_CURWIN)->MoveWindow(&rect,false);
				GetDlgItem(IDC_CURWIN)->ShowWindow(SW_NORMAL);
			}
		}
	}

	//显示有效的分割画面
	for(k = nScreenStart ; k < nScreenStart + nSplit * nSplit ; k++)
	{
		m_playWnd[k].ShowWindow(SW_SHOW);
	}
	*/
}

//刷新当前显示画面的相关信息
void CNetSDKDemoDlg::UpdateCurScreenInfo()
{
	//判断是否打开了语音对讲
	SplitInfoNode siNode;
	memset(&siNode, 0, sizeof(siNode));

	BOOL bTalkOpen = FALSE;
	for (int i  = 0; i < MAX_CHANNUM; i++)
	{
		BOOL ret = GetSplitInfo_Main(i, &siNode);
		if (!ret)
		{
			MessageBox("error while getting split info");
			return;
		}
		if (siNode.Type == SPLIT_TYPE_MONITOR)
		{
			if (((SplitMonitorParam *)(siNode.Param))->isTalkOpen) 
			{
				bTalkOpen = TRUE;
				break;
			}
		}
	}
	m_normalBtnPannel.EnableMultiplay(!bTalkOpen);

	//更新保存数据项和音频项
	BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
	if (!ret)
	{
		MessageBox("error while getting split info");
		return;
	}

	m_saveDataPannel.SetCheckReal(siNode.isSaveData);
	m_saveDataPannel.SetCheckRaw(siNode.SavecbFileRaw ? 1 : 0);
	m_saveDataPannel.SetCheckStd(siNode.SavecbFileStd ? 1 : 0);
	m_saveDataPannel.SetCheckYuv(siNode.SavecbFileYUV ? 1 : 0);
	m_saveDataPannel.SetCheckPcm(siNode.SavecbFilePcm ? 1 : 0);

	m_advanceBtnPannel.SetCheckSound(m_curSoundSplit == m_curScreen ? 1 : 0);

	//更新视频参数项
	UpdateVideoCtrl(VIDEO_TOTAL);
	
	if (siNode.Type == SPLIT_TYPE_MONITOR &&
		((SplitMonitorParam *)siNode.Param)->isTalkOpen)
	{
		m_advanceBtnPannel.SetCheckTalk(1);
	}
	else
	{
		m_advanceBtnPannel.SetCheckTalk(0);
	}
}

//刷新视频参数控制区,nMode 0~3对应单项刷新
void CNetSDKDemoDlg::UpdateVideoCtrl(int nMode)
{
	SplitInfoNode siNode;
	memset(&siNode, 0, sizeof(siNode));
	BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
	if (!ret)
	{
		MessageBox("error while getting split info");
		return;
	}

	BYTE bVideo[4];
	memset(bVideo,0, 4);
	if(siNode.Type == SPLIT_TYPE_MONITOR)
	{
		memcpy(bVideo, siNode.nVideoParam.bParam, 4);
		BOOL nRet = CLIENT_ClientSetVideoEffect(siNode.iHandle, 
									bVideo[0], bVideo[1], bVideo[2], bVideo[3]);
		if (!nRet)
		{
			LastError();
		}
	}

	if (nMode == VIDEO_TOTAL) 
	{
		for (int i = 0; i < VIDEO_TOTAL; i++)
		{
			m_colorPannel.UpdateVideoDisplay(i, bVideo[i]);
		}
	}
	else
	{
		m_colorPannel.UpdateVideoDisplay(nMode, bVideo[nMode]);
	}
}  
    
/////////////for one////////////////
DWORD GetMonthDays(const DWORD& dwYear, const DWORD& dwMonth)
{
	DWORD dwMDays = 0;
	switch(dwMonth)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		dwMDays = 31;
	break;
	case 2:
	{
		if (((dwYear%4==0)&& dwYear%100) || (dwYear%400==0))
		{
			dwMDays = 29; 
		}
		else
		{
			dwMDays = 28;
		}
	}
	break;
	case 4:
	case 6:
	case 9:
	case 11:
	dwMDays = 30;
	break;
	default:
	break;
	} 

	return dwMDays;
}
 
/*
 * can't surpport year offset time
 */
NET_TIME GetSeekTimeByOffsetTime(const NET_TIME& bgtime, unsigned int offsettime)
{
	NET_TIME tmseek;
	memset(&tmseek, 0x00, sizeof(NET_TIME));
 
	DWORD dwNext = 0;
	//second
	tmseek.dwSecond = (bgtime.dwSecond+offsettime)%60;
	dwNext = (bgtime.dwSecond+offsettime)/60;
	//minute
	tmseek.dwMinute = (dwNext+bgtime.dwMinute)%60;
	dwNext = (dwNext+bgtime.dwMinute)/60;
	//hour
	tmseek.dwHour = (dwNext+bgtime.dwHour)%24;
	dwNext = (dwNext+bgtime.dwHour)/24;
 
	DWORD dwMDays = GetMonthDays(bgtime.dwYear, bgtime.dwMonth);
 
	//day
	tmseek.dwDay = (dwNext+bgtime.dwDay)%dwMDays;
	dwNext = (dwNext+bgtime.dwDay)/dwMDays;
	//month
	tmseek.dwMonth  = (dwNext+bgtime.dwMonth)%12;
	dwNext = (dwNext+bgtime.dwMonth)/12;
 
	tmseek.dwYear = dwNext+bgtime.dwYear;
 
	return tmseek;
}
 
/*
 * can't surpport year offset time
 */
DWORD GetOffsetTime(const NET_TIME& st, const NET_TIME& et)
{
	DWORD dwRet = -1; 
	if (et.dwYear != st.dwYear)
	{
		return dwRet;
	}

	DWORD dwDays = 0;

	for(int i=st.dwMonth+1; i < et.dwMonth; ++i)
	{
		dwDays += GetMonthDays(st.dwYear, i);
	}

	if (et.dwMonth == st.dwMonth)
	{
		dwDays +=et.dwDay - st.dwDay;
	}
	else
	{
		dwDays += et.dwDay;
		dwDays += GetMonthDays(st.dwYear, st.dwMonth) - st.dwDay;
	}

	dwRet = dwDays*24*60*60 + ((int)et.dwHour - (int)st.dwHour)*60*60 + 
		((int)et.dwMinute - (int)st.dwMinute)*60 + (int)et.dwSecond - (int)st.dwSecond;

	return dwRet;
}
/////////////for one////////////////
//播放进度条拖动的处理
BOOL CNetSDKDemoDlg::SeekPlayPositon(int nPos)
//void CNetSDKDemoDlg::OnReleasedcapturePlayPosition(NMHDR* pNMHDR, LRESULT* pResult) 
{
	SplitInfoNode siNode;
	memset(&siNode, 0, sizeof(siNode));
	BOOL ret = GetSplitInfo_Main(m_curScreen, &siNode);
	if (!ret)
	{
		MessageBox("error while getting split info");
		return FALSE;
	}

	ret = FALSE;
	if(siNode.Type == SPLIT_TYPE_NETPLAY)
	{
		SplitNetPlayParam * pbParam = (SplitNetPlayParam *)siNode.Param;
		if (pbParam->iStatus == STATUS_PAUSE) 
		{
			return FALSE;
		}

		pbParam->iPlayPos = nPos;
		DWORD total = pbParam->pFileInfo->fileinfo.size;
		ret = CLIENT_SeekPlayBack(siNode.iHandle, 0xFFFFFFFF, nPos * total /100);
		if (!ret)
		{
			LastError();
		}
	}
	else if (siNode.Type == SPLIT_TYPE_PBBYTIME) 
	{
		SplitPBByTimeParam * pbParam = (SplitPBByTimeParam *)siNode.Param;
		if (pbParam->iStatus == STATUS_PAUSE) 
		{
			return FALSE;
		}
		
		pbParam->npos = nPos;
		//DWORD time = g_IntervalTime(&pbParam->starttime, &pbParam->endtime);
		DWORD time = GetOffsetTime(pbParam->starttime, pbParam->endtime);
		
		BOOL ret = CLIENT_SeekPlayBack(siNode.iHandle, nPos * time /100, 0xFFFFFFFF);
		if (!ret)
		{
			LastError();
		}
	}

	return ret;
//	*pResult = 0;
}

////////////////////////////////////////////功能操作//////////////////////////////////////////////
//增加设备连接项
void CNetSDKDemoDlg::AddDevice() 
{
	AddDeviceDlg dlg;
		
	if(dlg.DoModal() == IDOK)
	{
		UpdateDeviceList();	   //刷新设备列表显示	
	}	
	// TODO: Add your control notification handler code here
	
}

//实时数据回调,用于计算码流统计和保存数据
void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser)
{
	if(dwUser == 0)
	{
		return;
	}
	CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
	dlg ->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
	
}

//回放数据回调函数,demo里将数据保存成文件
int CALLBACK PBDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, DWORD dwUser)
{
	if(dwUser == 0)
	{
		return -1;
	}
	CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
	dlg ->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
	return 1;
}

void CALLBACK RealDataCallBackEx(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize, LONG lParam, DWORD dwUser)
{
	if(dwUser == 0)
	{
		return;
	}

	CNetSDKDemoDlg *dlg = (CNetSDKDemoDlg *)dwUser;
	dlg->ReceiveRealData(lRealHandle,dwDataType, pBuffer, dwBufSize);
}

//根据设备列表取得设备Id,根据通道选择通道号
void CNetSDKDemoDlg::OpenChannel() 
{
	HTREEITEM node_dev, tmpnode;
	DWORD nItem;
	CString strCh;
	
	tmpnode = m_devicelist.GetSelectedItem();
	if(!tmpnode)
	{
		MessageBox(MSG_DEMODLG_CHECKSEL);
		return;
	}
	
	nItem = m_devicelist.GetItemData(tmpnode);
	if(nItem < 16)     //是通道项
	{
		node_dev = m_devicelist.GetParentItem(tmpnode);
		DeviceNode *pInfo = (DeviceNode *)m_devicelist.GetItemData(node_dev);

		OpenSingleChannel(pInfo, nItem, m_curScreen);
	}
	else if(nItem>29)             //设备项
	{
		OpenAllChannel((DeviceNode *)nItem);
	}
	else if((nItem>19) && (nItem<30))//未连接项
	{
		ConnectDevice();
	}
}

void CNetSDKDemoDlg::OpenSingleChannel(DeviceNode *pInfo, int nCh, int screenNo)
{
	//查询是否被列入轮循列表
	if (IsCycling((DWORD)pInfo, nCh))
	{
		MessageBox(MSG_DEMODLG_ERROR_CYCLING);
		return;
	}
	
	//关闭当前窗口的播放
	ProcessCloseScreen(screenNo);

	CWnd* pWnd = m_screenPannel.GetPage(screenNo);
	if (!pWnd)
	{
		return ;
	}

	LONG nID = pInfo->LoginID;

	LONG nChannelID;

//	nChannelID = CLIENT_RealPlay(nID, nCh, GetDlgItem(IDC_SCREEN1 + m_curScreen )->m_hWnd);
	nChannelID = CLIENT_RealPlayEx(nID, nCh, pWnd->m_hWnd/*m_playWnd[screenNo].m_hWnd*/, RType_Realplay);
	
	if(!nChannelID)
	{
		LastError();
		MessageBox(MSG_DEMODLG_OPENCHLFAILED);
		return;
	}
	//获取视频参数
	BYTE bVideo[4];
	BOOL nRet = CLIENT_ClientGetVideoEffect(nChannelID, &bVideo[0],&bVideo[1],&bVideo[2],&bVideo[3]);
	if (!nRet)
	{
		LastError();
	}

	SplitInfoNode siNode;
	memset(&siNode, 0, sizeof(siNode));
	BOOL ret = GetSplitInfo_Main(screenNo, &siNode);
	if (!ret)
	{
		MessageBox("error while getting split info");
	}
	siNode.Type = SPLIT_TYPE_MONITOR;
	siNode.nVideoParam.dwParam = *(DWORD *)bVideo;
	siNode.iHandle = nChannelID;

	SplitMonitorParam *mparam	= new SplitMonitorParam;
	mparam->pDevice  = pInfo;
	mparam->iChannel  = nCh;
	mparam->isTalkOpen = false;
	
	siNode.Param  = mparam;

	ret = SetSplitInfo_Main(screenNo, &siNode);
	if (!ret)
	{
		MessageBox("error while setting split info");	
	}

	//更新保存数据状态
	if(siNode.isSaveData)
	{
		CString strName ;
		strName.Format("savech%d.dav", nCh);
		BOOL ret = CLIENT_SaveRealData(nChannelID, strName.GetBuffer(0));
		if(!ret)
		{
			LastError();
			MessageBox(MSG_DEMODLG_SAVEDATAFAILED);
		}
	}

	UpdateCurScreenInfo();

	//更新音频
	if(m_curSoundSplit == screenNo)
	{
		BOOL nRet = CLIENT_OpenSound(nChannelID);
		if (!nRet)

⌨️ 快捷键说明

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