📄 outdevicemanage.cpp
字号:
// OutDeviceManage.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "OutDeviceManage.h"
#include <time.h>
const BYTE HEAT_BREAK[16] = {
0XFF,0XFF,0XFF,0XFF,
0X00,0X00,0X00,0X00,
0X00,0X00,0X00,0X00,
0X00,0XFE,0XEE,0XEE
};
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
COutDeviceManage::~COutDeviceManage()
{
//清除ConnectOutDevice
std::map<int, ConnectOutDevice*>::iterator itConnect;
for (itConnect=m_ConnectList.begin(); itConnect!=m_ConnectList.end(); itConnect++)
{
ConnectOutDevice* pconn = &*(itConnect->second);
if (pconn)
{
delete pconn;
pconn = NULL;
}
}
m_ConnectList.erase(m_ConnectList.begin(), m_ConnectList.end());
//清除ManageOneDev
std::map<int, ManageOneDev*>::iterator itdev;
lock a(m_readwrite_mutex);
for (itdev=m_outdevlist.begin(); itdev!=m_outdevlist.end(); itdev++)
{
ManageOneDev* pdev = &*(itdev->second);
if (pdev)
{
delete pdev;
pdev = NULL;
}
}
m_outdevlist.erase(m_outdevlist.begin(), m_outdevlist.end());
}
void COutDeviceManage::ReplayFn(unsigned int dsid, unsigned int fnid) //fn掉线重连后重新播放
{
// lock a(m_readwrite_mutex);//读写锁
std::map<int, ManageOneDev*>::iterator itDev;
for (itDev=m_outdevlist.begin(); itDev!=m_outdevlist.end(); itDev++) //遍历m_outdevlist
{
ManageOneDev* pdev = itDev->second;
if ( (pdev->m_curDsId == dsid) && (pdev->m_curFnId==fnid))
{
int ntemdsid, ntemfnid;
ntemdsid = ntemfnid = 0;
pdev->GetBhOfRealId(dsid, fnid, &ntemdsid, &ntemfnid);
if (ntemdsid>0 && ntemfnid>0)
{
pdev->m_temdsid = ntemdsid;
pdev->m_temfnid = ntemfnid;
}
pdev->OpenOneFn();
pdev->SetCurState(selected_fn);
}
}
}
void COutDeviceManage::Init()
{
DeviceControlCommand devicecontrolcommand;
char cNportIp[20];
GetPrivateProfileString("NPORT","IP",NULL,cNportIp,100,devicecontrolcommand.m_DCINIPath);//得到Nport的IP
int nDevNum = GetPrivateProfileInt("DEVNUM","NUM",0,devicecontrolcommand.m_DCINIPath);//得到Nport的数量
for (int i=0; i<nDevNum; i++)
{
//bh
char dev[20];
sprintf(dev, "DEV%d", i);
int nDevBh = GetPrivateProfileInt(dev,"BH",0,devicecontrolcommand.m_DCINIPath);//得到Nport的编号
//port
int nPort = GetPrivateProfileInt(dev,"PORT",0,devicecontrolcommand.m_DCINIPath); //得到Nport的端口
//jmqip
char cjmqip[20];
GetPrivateProfileString(dev,"JMQIP",NULL,cjmqip,100,devicecontrolcommand.m_DCINIPath);//得到解码器的IP
//last ds fn
int nLastDs = GetPrivateProfileInt(dev,"DSID",0,devicecontrolcommand.m_DCINIPath);//得到上一次切换的dsid
int nLastFn = GetPrivateProfileInt(dev,"FNID",0,devicecontrolcommand.m_DCINIPath);//得到上一次切换的fnid
int nJMQPORT = GetPrivateProfileInt(dev,"JMQPORT",0,devicecontrolcommand.m_DCINIPath); //得到解码器开放的端口
//new ManageOneDev
ManageOneDev* pManageOneDev = new ManageOneDev(nDevBh, cjmqip, nLastDs, nLastFn, m_MainHwnd,nJMQPORT);
if (pManageOneDev)
{
m_outdevlist.insert(pair<int,ManageOneDev*>(nDevBh, pManageOneDev));//将Nport的编号对应插入ManageOneDev列表
}
//new ConnectOutDevice
ConnectOutDevice* pConnectOutDevice = new ConnectOutDevice(nDevBh, cNportIp, nPort, this);
if (pConnectOutDevice)
{
m_ConnectList.insert(pair<int, ConnectOutDevice*>(nDevBh, pConnectOutDevice));//将Nport的编号、IP、端口对应插入ManageOneDev列表
}
}
//启动解析线程
Start();
}
void COutDeviceManage::Dispatch(unsigned int id, COMMAND* pcommand)
{
// lock a(m_readwrite_mutex);
std::map<int, ManageOneDev*>::iterator itDev;
itDev = m_outdevlist.find(id);
if (itDev != m_outdevlist.end())
{
//itDev->second->PushCommand(pcommand);
#if 1
FILE* fp = fopen("c:\\Dispatch.txt", "ab+");
if (fp)
{
char cprint[1024]="0";
for(int i=0; i<16; i++)
{
char cdata[20]="0";
sprintf(cdata, "%02X ", pcommand->command[i]);
fwrite(cdata, strlen(cdata), 1, fp);
}
fwrite("\r\n", 2, 1, fp);
fclose(fp);
}
#endif
itDev->second->Parse(*pcommand);
}
}
void COutDeviceManage::Stop()
{
m_bExit = false;
}
void COutDeviceManage::Start()
{
boost::thread thrd1(boost::bind(&COutDeviceManage::Run, this));
}
void COutDeviceManage::Run()
{
std::map<int, ManageOneDev*>::iterator itdev;
while(!m_bExit)
{
//Wait(1);
Sleep(1);
// lock a(m_readwrite_mutex);
for (itdev=m_outdevlist.begin(); itdev!=m_outdevlist.end(); itdev++)
{
//itdev->second->Parse();
if (itdev->second->m_curstat == spoll)
itdev->second->FnPoll();
}
}
}
//************************************************************************************
//ManageOneDev:通信类 Parse
//
//
//*************************************************************************************
/*
void ManageOneDev::Parse()
{
//lock a(m_mutex);
int nNum = -1;
std::list<COMMAND>::iterator itcommand;
for (itcommand=m_commandlist.begin(); itcommand!=m_commandlist.end(); itcommand++)
{
COMMAND tcmd = *itcommand;
switch(tcmd.type)
{
case -1: //错误命令
break;
case YKCMD_UP: //上
if (selected_fn <= m_curstat)
{
//发送向上命令
SendControlCommand(OP_UP_START);
m_curstat = sup;
WriteRunLog("上");
}
break;
case YKCMD_UPDOWN_STOP: //上下停止
if (m_curstat == sup)
{
if (!SendControlCommand(OP_UP_STOP))
{
break;
}
m_curstat = supstop;
WriteRunLog("上停止");
}
else if (m_curstat == sdown)
{
if (!SendControlCommand(OP_DOWN_STOP))
{
break;
}
m_curstat = sdownstop;
WriteRunLog("下停止");
}
break;
case YKCMD_DOWN: //下
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_DOWN_START);
m_curstat = sdown;
WriteRunLog("下");
}
break;
case YKCMD_LEFT: //左
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_LEFT_START);
m_curstat = sleft;
WriteRunLog("左");
}
break;
case YKCMD_LEFTRIGHT_STOP: //左右停止
if (m_curstat == sleft)
{
if (!SendControlCommand(OP_LEFT_STOP))
{
break;
}
WriteRunLog("左停止");
m_curstat = sleftstop;
}
else if (m_curstat == sright)
{
SendControlCommand(OP_RIGHT_STOP);
WriteRunLog("右停止");
m_curstat = srightstop;
}
break;
case YKCMD_RIGHT: //右
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_RIGHT_START);
m_curstat = sright;
WriteRunLog("右");
}
break;
case YKCMD_NEAR: //推近
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_FOCUSNEAR_START);
m_curstat = snear;
WriteRunLog("推近");
}
break;
case YKCMD_JJ_STOP: //推近拉远停止
if (m_curstat == snear)
{
SendControlCommand(OP_FOCUSNEAR_STOP);
m_curstat = snearstop;
WriteRunLog("推近停止");
}
else if (m_curstat == sfar)
{
SendControlCommand(OP_FOCUSFAR_STOP);
m_curstat = sfarstop;
WriteRunLog("拉远停止");
}
break;
case YKCMD_FAR: //拉远
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_FOCUSFAR_START);
m_curstat = sfar;
WriteRunLog("拉远");
}
break;
case YKCMD_SELFN: //选择fn
if (selected_ds <= m_curstat)
{
//设置fnid
m_temfnid = m_temid;
if (m_temdsid>0 && m_temfnid>0)
{
GetRealDsFnId(m_temdsid, m_temfnid, &m_curDsId, &m_curFnId);
if (m_curDsId >0 && m_curFnId>0)
{
m_curstat = selected_fn;
OpenOneFn();
WriteCurStateToIni(m_curDsId,m_curFnId);
//WriteRunLog("选择fn");
}
break;
}
//发送打开图像命令
break;
}
break;
case YKCMD_AUTOOPEN:
m_curstat = spoll;
break;
case YKCMD_AUTOCLOSE: //轮训结束
m_curstat = spollstop;
break;
case YKCMD_SELDSONE: //选择ds
case YKCMD_SELDSTOW:
//设置dsid
m_curDsId = 0;
m_temdsid = m_temid;
m_curstat = selected_ds;
break;
case YKCMD_NUM: //数字键
m_temid = tcmd.command[10];
break;
case YKCMD_CLEAR://清除状态,
m_temdsid = 0;
m_temfnid = 0;
m_curstat = init;
break;
default:
break;
}
m_commandlist.erase(itcommand++);
break;
}
if (m_curstat == spoll)
{
FnPoll();
}
}
*/
void ManageOneDev::Parse(COMMAND tcmd)
{
//lock a(m_mutex);
//int nNum = -1;
//std::list<COMMAND>::iterator itcommand;
//for (itcommand=m_commandlist.begin(); itcommand!=m_commandlist.end(); itcommand++)
{
//COMMAND tcmd = *itcommand;
switch(tcmd.type)
{
case -1: //错误命令
break;
case YKCMD_UP: //上
if (selected_fn <= m_curstat)
{
//发送向上命令
SendControlCommand(OP_UP_START);
m_curstat = sup;
WriteRunLog("上");
}
break;
case YKCMD_UPDOWN_STOP: //上下停止
if (m_curstat >=selected_fn)
{
if (!SendControlCommand(OP_UP_STOP))
{
break;
}
m_curstat = supstop;
WriteRunLog("上停止");
}
// else if (m_curstat == sdown)
// {
// if (!SendControlCommand(OP_DOWN_STOP))
// {
// break;
// }
// m_curstat = sdownstop;
// WriteRunLog("下停止");
// }
break;
case YKCMD_DOWN: //下
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_DOWN_START);
m_curstat = sdown;
WriteRunLog("下");
}
break;
case YKCMD_LEFT: //左
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_LEFT_START);
m_curstat = sleft;
WriteRunLog("左");
}
break;
case YKCMD_LEFTRIGHT_STOP: //左右停止
if (m_curstat >=selected_fn)
{
if (!SendControlCommand(OP_LEFT_STOP))
{
break;
}
WriteRunLog("左停止");
m_curstat = sleftstop;
}
break;
case YKCMD_RIGHT: //右
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_RIGHT_START);
m_curstat = sright;
WriteRunLog("右");
}
break;
case YKCMD_NEAR: //推近
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_FOCUSNEAR_START);
m_curstat = snear;
WriteRunLog("推近");
}
break;
case YKCMD_JJ_STOP: //推近拉远停止
if (m_curstat >=selected_fn)
{
SendControlCommand(OP_FOCUSNEAR_STOP);
m_curstat = snearstop;
WriteRunLog("推近停止");
}
break;
case YKCMD_FAR: //拉远
if (selected_fn <= m_curstat)
{
SendControlCommand(OP_FOCUSFAR_START);
m_curstat = sfar;
WriteRunLog("拉远");
}
break;
case YKCMD_SELFN: //选择fn
if (selected_ds <= m_curstat)
{
//设置fnid
m_temfnid = m_temid;
if (m_temdsid>0 && m_temfnid>0)
{
GetRealDsFnId(m_temdsid, m_temfnid, &m_curDsId, &m_curFnId);
if (m_curDsId >0 && m_curFnId>0)
{
m_curstat = selected_fn;
OpenOneFn();
WriteCurStateToIni(m_curDsId,m_curFnId);
//WriteRunLog("选择fn");
}
break;
}
//发送打开图像命令
break;
}
break;
case YKCMD_AUTOOPEN:
m_curstat = spoll;
break;
case YKCMD_AUTOCLOSE: //轮训结束
m_curstat = spollstop;
break;
case YKCMD_SELDSONE: //选择ds
case YKCMD_SELDSTOW:
//设置dsid
m_curDsId = 0;
m_temdsid = m_temid;
m_curstat = selected_ds;
break;
case YKCMD_NUM: //数字键
m_temid = tcmd.command[10];
break;
case YKCMD_CLEAR://清除状态,
m_temdsid = 0;
m_temfnid = 0;
m_curstat = init;
break;
default:
break;
}
//m_commandlist.erase(itcommand++);
//break;
}
//if (m_curstat == spoll)
//{
// FnPoll();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -