📄 videocommdlg.cpp
字号:
m_NameInConference.ResetContent();
m_WantWatchOK.SetCheck(0);
m_pWaveIn->End();
m_pVideoCapture->EndCap();
m_pInterfaceToBoard->End();
m_pWaveOut->End();
m_pDisplay->End();
m_pFileTransmit->End();
m_pDataComm->CloseConnection();
EndWaitCursor();
return;
}
void CVideoCommDlg::OnAddConference()
{
OnBarBegin();
// TODO: Add your control notification handler code here
if(!m_bIsSendingCommand)
{
m_bHaveAnswer = FALSE;
m_bIsSendingCommand = TRUE;
m_nNowCommand = ID_ADDCONFERENCE;
m_byCILength = 0;
m_pbyCommandFrame[0] = TRequestAddConference;//1
m_pbyCommandFrame[1] = m_TPortStatus.GetPortNameLength();//1
CopyMemory(m_pbyCommandFrame+2, m_TPortStatus.GetPortName(), m_pbyCommandFrame[1]);
m_byCILength = 2 + m_pbyCommandFrame[1];
//Now send command
SetTimer(REPEATSENDCOMMAND, RepeatSendCommandInternal, NULL);
//CommandCallBack(m_pbyCommandFrame, m_byCILength, FS_VALID);//Send
//After add to conference, enable this button
m_PaletteBar.SetState(ID_ADDCONFERENCE, TBSTATE_CHECKED);
}
else
MessageBox("现在有命令正在发送,并且没有受到应答,请稍候再试!");
return;
}
void CVideoCommDlg::OnExitConference()
{
// TODO: Add your control notification handler code here
if(!m_bIsSendingCommand)
{
m_bHaveAnswer = FALSE;
m_bIsSendingCommand = TRUE;
m_nNowCommand = ID_EXITCONFERENCE;
m_byCILength = 0;
m_pbyCommandFrame[0] = TRequestExitConference;//1
m_byCILength = 1;
//Now send command
SetTimer(REPEATSENDCOMMAND, RepeatSendCommandInternal, NULL);
//CommandCallBack(m_pbyCommandFrame, m_byCILength, FS_VALID);//Send
}
else
MessageBox("现在有命令正在发送,并且没有受到应答,请稍候再试!");
return;
}
void CVideoCommDlg::OnBroadcast()
{
// TODO: Add your control notification handler code here
if(!m_bIsSendingCommand)
{
m_bHaveAnswer = FALSE;
m_bIsSendingCommand = TRUE;
m_nNowCommand = ID_BROADCAST;
m_byCILength = 0;
m_pbyCommandFrame[0] = TRequestToken;//1
m_byCILength = 1;
//Now send command
SetTimer(REPEATSENDCOMMAND, RepeatSendCommandInternal, NULL);
//CommandCallBack(m_pbyCommandFrame, m_byCILength, FS_VALID);//Send
m_PaletteBar.SetState(ID_BROADCAST, TBSTATE_CHECKED);
}
else
MessageBox("现在有命令正在发送,并且没有受到应答,请稍候再试!");
return;
}
void CVideoCommDlg::OnStopBroadcast()
{
// TODO: Add your control notification handler code here
if(!m_bIsSendingCommand)
{
m_bHaveAnswer = FALSE;
m_bIsSendingCommand = TRUE;
m_nNowCommand = ID_STOPBROADCAST;
m_byCILength = 0;
m_pbyCommandFrame[0] = TRequestReleaseToken;//1
m_byCILength = 1;
//Now send command
SetTimer(REPEATSENDCOMMAND, RepeatSendCommandInternal, NULL);
//CommandCallBack(m_pbyCommandFrame, m_byCILength, FS_VALID);//Send
m_PaletteBar.SetState(ID_STOPBROADCAST, TBSTATE_CHECKED);
}
else
MessageBox("现在有命令正在发送,并且没有受到应答,请稍候再试!");
return;
}
void CVideoCommDlg::OnWatchOne()
{
// TODO: Add your control notification handler code here
if((!m_bIsSendingCommand)&&(m_TPortStatus.m_bOwnToken))
{
m_bHaveAnswer = FALSE;
m_bIsSendingCommand = TRUE;
m_nNowCommand = ID_WATCHONE;
m_byCILength = 0;
int nUserSel = 0;
CString SelName;
BYTE byPortNumber = 0;
m_pbyCommandFrame[0] = TWantWatch;//1
//想看的终端号, 所以终端必须能知道名称对应的端口号, 需要MCU传来
nUserSel = m_NameInConference.GetCurSel();
m_NameInConference.GetText(nUserSel, SelName);
//根据名称查找对应的端口号
for(int i=0; i<m_nTotalAddTerminalCount; i++)
{
if(NameNumber[i].Name == SelName)
{
byPortNumber = NameNumber[i].Number;
break;
}
}
m_pbyCommandFrame[1] = byPortNumber;//1
m_byCILength = 2;
//Now send command
SetTimer(REPEATSENDCOMMAND, RepeatSendCommandInternal, NULL);
//CommandCallBack(m_pbyCommandFrame, m_byCILength, FS_VALID);//Send
m_PaletteBar.SetState(ID_WATCHONE, TBSTATE_CHECKED);
}
else
MessageBox("现在有命令正在发送,并且没有受到应答,请稍候再试!");
return;
}
void CVideoCommDlg::OnStopWatchOne()
{
// TODO: Add your control notification handler code here
if(!m_bIsSendingCommand)
{
m_bHaveAnswer = FALSE;
m_bIsSendingCommand = TRUE;
m_nNowCommand = ID_STOPWATCHONE;
m_byCILength = 0;
m_pbyCommandFrame[0] = TStopWatch;//1
m_byCILength = 1;
//Now send command
SetTimer(REPEATSENDCOMMAND, RepeatSendCommandInternal, NULL);
//CommandCallBack(m_pbyCommandFrame, m_byCILength, FS_VALID);//Send
m_PaletteBar.SetState(ID_STOPWATCHONE, TBSTATE_CHECKED);
}
else
MessageBox("现在有命令正在发送,并且没有受到应答,请稍候再试!");
return;
}
void CVideoCommDlg::OnData()
{
//m_pDataComm->OpenComm(2, this);
m_nNowCommand = ID_DATA;
static int nState = 0;
char strWhite[] ="电子部三十所 " ;
char strChildWhite[]="电子白板";
HWND ghWhite,ghChildWhite,ghChildWhite1;
if(nState)//Checked
{
nState = 0;
m_pDataComm->CloseConnection();
//Find data service's windows and postmessage wm_close, see 863's terminal
//KillTimer(READDATAFROMSERIAL);
m_pVideoCapture->DisableVisible(0);
m_PaletteBar.SetState(ID_DATA, TBSTATE_ENABLED);
}
else
{
nState = 1;//Checked
InitComm(2);//Initilize the serial port
//start read data from serila using timer
//SetTimer(READDATAFROMSERIAL, ReadDataFromSerialInternal, NULL);
m_PaletteBar.SetState(ID_DATA, TBSTATE_CHECKED|TBSTATE_ENABLED);
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
// Set up members of STARTUPINFO structure.
ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
if(::CreateProcess(NULL, "E:\\WHITE\\VMWIN.EXE", NULL, NULL, TRUE,
0, NULL, NULL, &siStartInfo, &piProcInfo))
{
Sleep(200);
ghWhite =::FindWindow(NULL,strWhite);
ghChildWhite=::GetWindow(ghWhite,GW_CHILD);
ghChildWhite1=::GetWindow(ghChildWhite,GW_CHILD);
//ghChildWhite2=::GetWindow(ghChildWhite1,GW_CHILD);
::MoveWindow(ghWhite,5,100,370,400,TRUE);
::PostMessage(ghChildWhite,WM_MDIMAXIMIZE,(WPARAM)ghChildWhite1,0L);
}
}
}
int CVideoCommDlg::InitComm(int nPort)
{
m_pDataComm->OpenComm(nPort, this);
return 0;
}
int CVideoCommDlg::StrToByte(CString str, BYTE *byCon, int nLength)
{
for(int i=0; i<nLength; i++)
byCon[i] = (BYTE)str[i];
return 0;
}
int CVideoCommDlg::ByteToStr(BYTE *pFrame, char *Msg, int nLength)
{
for(int i=0; i<nLength; i++)
Msg[i] = (char)pFrame[i];
return 0;
}
BOOL CVideoCommDlg::GetUserSetting()
{
//Open the data of saved before
HKEY hKey = NULL;
DWORD dwDisposition = 0;
long re0 = ::RegCreateKeyEx(HKEY_CURRENT_USER, data_Set, NULL,
NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL,
&hKey, &dwDisposition);
if(re0 != ERROR_SUCCESS)//Open or create fail
MessageBox("无法打开注册表!请输入参数。");
else
{
//Query data about Port rate, video quant and this teminal's name
BYTE byPortRate = 1;
BYTE byVideoQuant = 4;
BYTE byVideoCRC = 0;
BYTE bySoftAudio = 1;
DWORD dwLength = 1;
DWORD dwType_1 = REG_DWORD;
DWORD dwType_2 = REG_SZ;
BYTE cUserName[MAXNAMELENGTH];
BYTE byNameLength = 0;
long re1 = ::RegQueryValueEx(hKey, "PortRate", NULL, &dwType_1, &byPortRate, &dwLength);
re1 = ::RegQueryValueEx(hKey, "PortRate", NULL, &dwType_1, &byPortRate, &dwLength);
long re2 = ::RegQueryValueEx(hKey, "VideoQuant", NULL, &dwType_1, &byVideoQuant, &dwLength);
long re3 = ::RegQueryValueEx(hKey, "VideoCRC", NULL, &dwType_1, &byVideoCRC, &dwLength);
long re4 = ::RegQueryValueEx(hKey, "SoftAudio", NULL, &dwType_1, &bySoftAudio, &dwLength);
dwLength = MAXNAMELENGTH;
long re5 = ::RegQueryValueEx(hKey, "Name", NULL, &dwType_2, cUserName, &dwLength);
byNameLength = (BYTE)dwLength-1;//Get rid of the last '\0'
if(re1 != ERROR_SUCCESS || re2 != ERROR_SUCCESS || re3 != ERROR_SUCCESS ||
re4 != ERROR_SUCCESS || re5 != ERROR_SUCCESS)
{
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// Process any inserts in lpMsgBuf.
// ...
// Display the string.
MessageBox((LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
MessageBox("错误:无法读取注册表!请重新输入参数。");
}
m_nPortRate=byPortRate;
m_nQuant=byVideoQuant;
m_bVideoCRC = byVideoCRC;
m_bSoftAudio = bySoftAudio;
m_MyName=CString(cUserName);
::RegCloseKey(hKey);
//Save the name to port status
char thename[MAXNAMELENGTH];
for(int j=0; j<byNameLength; j++)
thename[j] = (char)cUserName[j];
m_TPortStatus.SetPortName(thename, byNameLength);
}
return TRUE;
}
void CVideoCommDlg::OnAdvanced()
{
// TODO: Add your control notification handler code here
CConfigDlg ConfigDlg;
ConfigDlg.DoModal();
}
void CVideoCommDlg::OnFileTransmit()
{
// TODO: Add your control notification handler code here
const int nLength = 9;
const char cButtonTextBegin[] = "文件传输";
const char cButtonTextStop[] = "停止传输";
char cBuffer[20];
//m_hFinishFileTransmit = ::CreateEvent(NULL, TRUE, FALSE, "IsFinishFileTransmit");
GetDlgItemText(IDC_FILETRANSMIT, cBuffer, 20);
if(::strncmp(cBuffer, cButtonTextStop, nLength) == 0)//is 'Stop send', then so stop it
{
SetDlgItemText(IDC_FILETRANSMIT, cButtonTextBegin);
m_pFileTransmit->End();
m_byAction = MEDONOTHINGABOUTFILE;
return;
}
m_byAction = MESENDFILE;
SetDlgItemText(IDC_FILETRANSMIT, cButtonTextStop);
m_pFileTransmit->StartSendFileThread();
}
void CVideoCommDlg::FileDataToChannel(BYTE *pContent, UINT nLength)
{
if(m_pFileSendChannel)
m_pFileSendChannel->SendData(pContent, nLength);
}
void CVideoCommDlg::ChannelToFileData(BYTE *pFrame, int nLength)
{
//static BYTE byAction = MEDONOTHINGABOUTFILE;
static BYTE byStartReceive = 0;//0--not start, 1---have start, 2--have start and exit
static DWORD dwResult = 0;
ASSERT(m_pFileTransmit != NULL);
//m_byAction = m_pFileTransmit->MeAction();
//now we design this file transmition is point to point, so only the terminal
//that is wathced by broadcasting terminal can receive file data
if(m_bIsMulticast)
{
if(m_byAction == MESENDFILE)
{
m_pFileTransmit->ReceiveDataFromChannel(pFrame, nLength);
}
else
{
if(m_bIsWatched)
{
switch(byStartReceive)
{
case 2://have started and now have exited
if(::memcmp(pFrame, pZRQINITFrame, ZRQINITFrameLength) == 0)//Now a new file transmit receive
byStartReceive = 0;//So we start receive again
else
return;
break;
case 1://have start receive
dwResult = m_pFileTransmit->GetReceiveFileThreadExitCode();
if(dwResult != STILL_ACTIVE)
{
byStartReceive = 2;//have started and now have exited
return;
}
break;
case 0://Not start
byStartReceive = 1;
m_pFileTransmit->StartReceiveFileThread();
break;
}
m_pFileTransmit->ReceiveDataFromChannel(pFrame, nLength);
}//end of m_bIsWatched
}//end of m_byAction != MESENDFILE
}//end of m_bIsMulticast
else
{
if(m_byAction == MESENDFILE)
{
m_pFileTransmit->ReceiveDataFromChannel(pFrame, nLength);
}
else
{
switch(byStartReceive)
{
case 2://have started and now have exited
if(::memcmp(pFrame, pZRQINITFrame, ZRQINITFrameLength) == 0)//Now a new file transmit receive
byStartReceive = 0;//So we start receive again
else
return;
break;
case 1://have start receive
dwResult = m_pFileTransmit->GetReceiveFileThreadExitCode();
if(dwResult != STILL_ACTIVE)
{
byStartReceive = 2;//have started and now have exited
return;
}
break;
case 0://Not start
byStartReceive = 1;
m_pFileTransmit->StartReceiveFileThread();
break;
}
m_pFileTransmit->ReceiveDataFromChannel(pFrame, nLength);
}//end of m_byAction != MESENDFILE
}//end of !m_bIsMultcast
/*
//now we design this file transmition is point to point, so only the terminal
//that is wathced by broadcasting terminal can receive file data
if(m_bIsMulticast)
{
if((byAction != MESENDFILE) && m_bIsWatched)//if not me send file and not watched
{
goto CONTINUE;
}
else
{
::AfxMessageBox("Skip file data!");
return;
}
}
CONTINUE:ASSERT(m_pFileTransmit != NULL);
if(byStartReceive == 2 && byAction != MESENDFILE)//have started and now have exited
{
if(::memcmp(pFrame, pZRQINITFrame, ZRQINITFrameLength) == 0)//Now a new file transmit receive
byStartReceive = 0;//So we start receive again
else
return;
}
if(byStartReceive == 1 && byAction != MESENDFILE)//have start receive
{
dwResult = m_pFileTransmit->GetReceiveFileThreadExitCode();
if(dwResult != STILL_ACTIVE)
{
byStartReceive = 2;//have started and now have exited
return;
}
}
if(byStartReceive == 0 && byAction != MESENDFILE)//Not start
{
byStartReceive = 1;
byAction = m_pFileTransmit->MeAction();
if(byAction != MESENDFILE)
{
m_pFileTransmit->StartReceiveFileThread();
}
}
m_pFileTransmit->ReceiveDataFromChannel(pFrame, nLength);*/
}
void CVideoCommDlg::DisplayInfo(LPCTSTR lpsStr, BOOL bAlert)
{
//clear before content, maybe have other good method
::MessageBeep(MB_OK);
m_DisplayInfo.SetWindowText(" ");
m_DisplayInfo.SetWindowText(lpsStr);
}
void DisplayInfo1(LPCTSTR lpsStr, BOOL bAlert)
{
CVideoCommDlg VideoCommDlg;
VideoCommDlg.DisplayInfo(lpsStr, bAlert);
}
void CVideoCommDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
}
void CVideoCommDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDialog::OnLButtonDown(nFlags, point);
}
void CVideoCommDlg::OnCancelMode()
{
CDialog::OnCancelMode();
// TODO: Add your message handler code here
}
void CVideoCommDlg::OnCaptureChanged(CWnd *pWnd)
{
// TODO: Add your message handler code here
CDialog::OnCaptureChanged(pWnd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -