📄 ~rightmd.~cpp
字号:
// RightMD.cpp : implementation file
//
#include "stdafx.h"
#include "../dvrmanager.h"
#include "../utils/common.h"
#include "../utils/custom_msgs.h"
#include "../video/video_channel.h"
#include "net.h"
#include "RightMD.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CRightMD dialog
#define REC_MAX 99
#define REC_MIN 1
CRightMD* CRightMD::self = NULL;
CRightMD* CRightMD::the_one()
{
return self;
}
CRightMD::CRightMD(CWnd* pParent /*=NULL*/)
: baseclass(CRightMD::IDD, pParent), mask(&m_grid)
{
//{{AFX_DATA_INIT(CRightMD)
m_date00 = 0;
m_date01 = 0;
m_date10 = 0;
m_date11 = 0;
m_rec_duration = 0;
m_enable_md = TRUE;
m_rec_sched = TRUE;
m_rec_day = 0;
m_md_sens = 0;
m_channel = 0;
m_which = -1;
//}}AFX_DATA_INIT
ZeroMemory(&opt, sizeof(TREC_MOTIONRECPARA));
self = this;
}
void CRightMD::DoDataExchange(CDataExchange* pDX)
{
if( 1 )//!pDX->m_bSaveAndValidate )
{
if( m_rec_duration < REC_MIN )
{
m_rec_duration = REC_MIN;
}
if( m_rec_duration > REC_MAX )
{
m_rec_duration = REC_MAX;
}
}
baseclass::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRightMD)
DDX_Control(pDX, IDCB_REC_DAY, m_cbweek);
DDX_Control(pDX, ID_S, m_s);
DDX_Control(pDX, IDCB_CHANNEL, m_cbchannel);
DDX_Control(pDX, ID_11, m_11);
DDX_Control(pDX, IDBTN_SET_NET, m_btn_set_net);
DDX_Control(pDX, IDBTN_REFRESH_NET, m_btn_refresh_net);
DDX_Control(pDX, ID_FLOWER, m_grid);
DDX_Control(pDX, ID_1, m_1);
DDX_Control(pDX, IDCK_REC_SCHEDULE, m_ck_rec_sched);
DDX_Control(pDX, IDCK_ENABLE, m_ck_enable);
DDX_Control(pDX, IDCB_WHICH, m_cbwhich);
DDX_Control(pDX, ID_6, m_6);
DDX_Control(pDX, ID_2, m_2);
DDX_Control(pDX, ID_TITLE, m_title);
DDX_Control(pDX, ID_10, m_10);
DDX_Control(pDX, ID_9, m_9);
DDX_Control(pDX, ID_8, m_8);
DDX_Control(pDX, ID_7, m_7);
DDX_Control(pDX, ID_5, m_5);
DDX_Control(pDX, ID_4, m_4);
DDX_Control(pDX, ID_3, m_3);
DDX_DateTimeCtrl(pDX, IDDATE_00, m_date00);
DDX_DateTimeCtrl(pDX, IDDATE_01, m_date01);
DDX_DateTimeCtrl(pDX, IDDATE_10, m_date10);
DDX_DateTimeCtrl(pDX, IDDATE_11, m_date11);
DDX_Text(pDX, IDED_REC_DURATION, m_rec_duration);
DDX_Check(pDX, IDCK_ENABLE, m_enable_md);
DDX_Check(pDX, IDCK_REC_SCHEDULE, m_rec_sched);
DDX_CBIndex(pDX, IDCB_REC_DAY, m_rec_day);
DDX_CBIndex(pDX, IDCB_MD_SENS, m_md_sens);
DDX_CBIndex(pDX, IDCB_CHANNEL, m_channel);
DDX_CBIndex(pDX, IDCB_WHICH, m_which);
//}}AFX_DATA_MAP
/*
* 当允许/禁止MD时, 更新控件状态
*/
static UINT ids[] =
{
IDED_REC_DURATION, ID_SPIN,
IDCB_MD_SENS,
ID_FLOWER, //IDCB_REC_DAY,
IDCK_REC_SCHEDULE,
};
for( int i=0; i<SIZE_OF(ids); i++ )
{
GetDlgItem(ids[i])->EnableWindow(m_enable_md);
}
GetDlgItem(IDDATE_00)->EnableWindow(m_rec_sched & m_enable_md);
GetDlgItem(IDDATE_01)->EnableWindow(m_rec_sched & m_enable_md);
GetDlgItem(IDDATE_10)->EnableWindow(m_rec_sched & m_enable_md);
GetDlgItem(IDDATE_11)->EnableWindow(m_rec_sched & m_enable_md);
if( pDX->m_bSaveAndValidate )
{
memcpy(opt.alarm_region, mask->mask_data(), 8);
}
}
void CRightMD::get_data()
{
UpdateData();
opt.channel = m_channel;
opt.onoff = m_enable_md;
memcpy(opt.alarm_region, mask->mask_data(), 8);
opt.rectime = m_rec_duration;
opt.recsmart = m_md_sens+1; // +1, 2003-9-24 nodman
get_date();
}
// Dialog -> opt
void CRightMD::get_date()
{
UpdateData();
// 如果对某一天不允许MD Sched
if( !m_rec_sched )
{
UNSET_DAY(opt, m_rec_day);
return;
}
SEG1_BGN_HOUR(opt, m_rec_day) = m_date00.GetHour();
SEG1_BGN_MIN(opt, m_rec_day) = m_date00.GetMinute();
SEG1_END_HOUR(opt, m_rec_day) = m_date01.GetHour();
SEG1_END_MIN(opt, m_rec_day) = m_date01.GetMinute();
SEG2_BGN_HOUR(opt, m_rec_day) = m_date10.GetHour();
SEG2_BGN_MIN(opt, m_rec_day) = m_date10.GetMinute();
SEG2_END_HOUR(opt, m_rec_day) = m_date11.GetHour();
SEG2_END_MIN(opt, m_rec_day) = m_date11.GetMinute();
/*
* EVERDAY和其他天数(1-7)不能同时设置
*/
if( m_rec_day == 0 ) // EVERYDAY
{
if( m_rec_sched )
{
for( int i=1; i<8; i++ )
{
UNSET_DAY(opt, i);
}
}
}
else // OTHER days
{
if( m_rec_sched )
{
UNSET_DAY(opt, 0); // clear EVERYDAY flag
}
}
}
// opt -> Dialog
void CRightMD::put_date()
{
m_date00 = SEG1_BGN(opt, m_rec_day);
m_date01 = SEG1_END(opt, m_rec_day);
m_date10 = SEG2_BGN(opt, m_rec_day);
m_date11 = SEG2_END(opt, m_rec_day);
}
BEGIN_MESSAGE_MAP(CRightMD, baseclass)
//{{AFX_MSG_MAP(CRightMD)
ON_BN_CLICKED(IDCK_ENABLE, OnEnable)
ON_CBN_SELCHANGE(IDCB_WHICH, OnSelchangeWhich)
ON_BN_CLICKED(IDBTN_REFRESH_NET, OnRefreshNet)
ON_CBN_SELCHANGE(IDCB_CHANNEL, OnSelchangeChannel)
ON_NOTIFY(UDN_DELTAPOS, ID_SPIN, OnDeltaposSpin)
ON_EN_CHANGE(IDED_REC_DURATION, OnChangeRecDuration)
ON_CBN_SELCHANGE(IDCB_REC_DAY, OnSelchangeRecDay)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDCK_REC_SCHEDULE, OnRecSchedule)
ON_BN_CLICKED(IDBTN_SET_NET, OnSetNet)
ON_NOTIFY(DTN_DATETIMECHANGE, IDDATE_00, OnDatetimechange00)
ON_NOTIFY(DTN_DATETIMECHANGE, IDDATE_01, OnDatetimechange01)
ON_NOTIFY(DTN_DATETIMECHANGE, IDDATE_10, OnDatetimechange10)
ON_NOTIFY(DTN_DATETIMECHANGE, IDDATE_11, OnDatetimechange11)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_UPDATE_DATA, on_update_data)
ON_MESSAGE(WM_CHANNEL_OPEN, on_channel_open)
ON_MESSAGE(WM_CHANNEL_CLOSE, on_channel_close)
MSG2(NTM_OPT_GET_OK, on_get_ok)
MSG2(NTM_OPT_SET_OK, on_set_ok)
MSG2(WM_LOGGED_OUT, on_logged_out)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRightMD message handlers
BOOL CRightMD::OnInitDialog()
{
baseclass::OnInitDialog();
init_label(m_1).SetFontBold(TRUE);
init_label(m_3);
init_label(m_4);
init_label(m_5);
init_label(m_7);
init_label(m_8);
init_label(m_9);
init_label(m_10);
init_label(m_11);
init_title(m_title);
m_grid.init();
fill_combo_week(&m_cbweek);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
CString CRightMD::get_alias()
{
CString alias;
UpdateData();
if( m_which == -1 )
return alias;
m_cbwhich.GetLBText(m_which, alias);
return alias;
}
/*
* 当允许/禁止MD时
*/
void CRightMD::OnEnable()
{
if( !is_visible(this) )
return;
GET_ALIAS;
opt.onoff = m_enable_md;
video_channel* vc = who_opened_it(alias, m_channel);
if( vc )
{
m_grid.clear_grid();
mask = vc;
}
else
{
if( mask != &m_grid )
{
mask->clear_grid();
mask = &m_grid;
}
}
if( m_enable_md )
mask->set_grid(8,8);
else
mask->clear_grid();
}
/*
* 异步UpdateData, 或者从内部更新MD信息
*/
LRESULT CRightMD::on_update_data(WPARAM w, LPARAM)
{
if( w == FALSE )
{
TREC_MOTIONRECPARA* m = &opt;
m_channel = m->channel; // 通道号
// if( m->channel != m_channel )
// return 0;
m_enable_md = m->onoff; // 允许MD
m_md_sens = m->recsmart-1; // 灵敏度
m_rec_duration = m->rectime; // 录像时间长度
memcpy(mask->mask_data(), m->alarm_region, 8); // 检测区域
m_rec_sched = IS_DAY_SET(opt, m_rec_day); // 是否定时
if( m_enable_md )
mask->set_grid(8,8);
else
mask->clear_grid();
mask->update(); // 刷新检测区域
// 更新定时时间段
if( m_rec_sched )
{
put_date();
}
else
{
m_date00 = m_date01 = m_date10 = m_date11 = CTime::GetCurrentTime();
}
}
UpdateData(w);
OnEnable();
return 0;
}
/*
* 过滤系统快捷键
*/
BOOL CRightMD::PreTranslateMessage(MSG* pMsg)
{
CHECK_ACCEL;
return baseclass::PreTranslateMessage(pMsg);
}
/*
* 当切换到我时
*/
void CRightMD::on_join()
{
if( m_cbwhich.GetCount()==0 )
{
fill_combo(&m_cbwhich);
m_cbchannel.EnableWindow(FALSE);
}
OnEnable();
}
/*
* 当切换到别的子对话框时
*/
void CRightMD::on_leave()
{
//m_cbwhich.ResetContent();
//m_cbchannel.ResetContent();
mask->set_grid(0,0);
// mask = &m_grid;
}
/*
* 网络回复: 读取主机MD信息成功
*/
//void CRightMD::on_get_ok(DWORD ip, USHORT port, NET_OPTIONS no, void* stuff)
MSG3(on_get_ok, CRightMD)
{
NET_OPTIONS no = (NET_OPTIONS)w;
void* stuff = (void*)l;
if( no != OPT_MD )
return 0;
TREC_MOTIONRECPARA* m = (TREC_MOTIONRECPARA*)stuff;
// if( m->channel > get_chnls(ip, port))
// return;
memcpy(&opt, m, sizeof(TREC_MOTIONRECPARA));
PostMessage(WM_UPDATE_DATA, FALSE);
info_balloon(IDS_MD_GET);
return 0;
}
//void CRightMD::on_set_ok(DWORD ip, USHORT port, NET_OPTIONS no)
MSG3(on_set_ok, CRightMD)
{
info_balloon(IDS_MD_SET);
return 0;
}
/*
* 变更控制主机地址 (which)
*/
void CRightMD::OnSelchangeWhich()
{
UpdateData();
GET_ALIAS;
fill_combo_chnls(alias, &m_cbchannel);
m_channel = 0;
UpdateData(FALSE);
m_cbchannel.EnableWindow(!alias.IsEmpty());
OnRefreshNet();
}
/*
* 改变通道 (channel)
*/
void CRightMD::OnSelchangeChannel()
{
GET_ALIAS;
OnRefreshNet();
OnEnable();
// PostMessage(WM_UPDATE_DATA, FALSE);
}
/*
* 更新按钮处理 (refresh)
*/
void CRightMD::OnRefreshNet()
{
GET_ALIAS;
// fill_combo_chnls(alias, &m_cbchannel);
// m_channel = 0;
// UpdateData(FALSE);
get_net_opt(alias, OPT_MD, m_channel, m_hWnd);
}
const UINT MIN = 0;
const UINT MAX = 90;
void CRightMD::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
NM_UPDOWN* p = (NM_UPDOWN*)pNMHDR;
UpdateData();
if( p->iDelta < 0 )
{
if( m_rec_duration != REC_MAX )
m_rec_duration++;
}
else
if( m_rec_duration != REC_MIN )
m_rec_duration--;
UpdateData(FALSE);
*pResult = 0;
}
void CRightMD::OnChangeRecDuration()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the baseclass::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
UpdateData();
}
void CRightMD::OnSelchangeRecDay()
{
UpdateData();
PostMessage(WM_UPDATE_DATA, FALSE);
}
HBRUSH CRightMD::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hb = baseclass::OnCtlColor(pDC, pWnd, nCtlColor);
return hb;
}
/*
* 允许MD时间设置
*/
void CRightMD::OnRecSchedule()
{
UpdateData();
get_date();
}
void CRightMD::OnSetNet()
{
UpdateData();
get_data();
GET_ALIAS;
set_net_opt(alias, OPT_MD, &opt, m_hWnd);
}
void CRightMD::OnDatetimechange00(NMHDR* pNMHDR, LRESULT* pResult)
{
get_date();
*pResult = 0;
}
void CRightMD::OnDatetimechange01(NMHDR* pNMHDR, LRESULT* pResult)
{
get_date();
*pResult = 0;
}
void CRightMD::OnDatetimechange10(NMHDR* pNMHDR, LRESULT* pResult)
{
get_date();
*pResult = 0;
}
void CRightMD::OnDatetimechange11(NMHDR* pNMHDR, LRESULT* pResult)
{
get_date();
*pResult = 0;
}
LRESULT CRightMD::on_channel_open(WPARAM, LPARAM)
{
OnEnable();
return 0;
}
LRESULT CRightMD::on_channel_close(WPARAM, LPARAM)
{
OnEnable();
return 0;
}
ON_LOGGED_OUT(CRightMD);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -