📄 speedcollect.cpp
字号:
// SpeedCollect.cpp : implementation file
//
#include "stdafx.h"
#include "CSpeed.h"
#include "SpeedCollect.h"
#include "public.h"
#include "CSpeedSet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.1415926
#define STARTX 0
#define STARTX1 20
#define STARTX2 220
#define STARTX3 420
#define STARTY1 290//395
#define MIDDOW_LENTH 225//400
#define BOTTOM_LENTH 30
/////////////////////////////////////////////////////////////////////////////
// SpeedCollect dialog
SpeedCollect::SpeedCollect(CWnd* pParent /*=NULL*/)
: CDialog(SpeedCollect::IDD, pParent), CMMTimers(1)
{
//{{AFX_DATA_INIT(SpeedCollect)
m_str = _T("");
//}}AFX_DATA_INIT
}
void SpeedCollect::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(SpeedCollect)
DDX_Control(pDX, IDC_DISPLAY, m_Canvas);
DDX_Text(pDX, IDC_EDIT, m_str);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(SpeedCollect, CDialog)
//{{AFX_MSG_MAP(SpeedCollect)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// SpeedCollect message handlers
void SpeedCollect::OnCancel()
{
// TODO: Add extra cleanup here
CFrameWnd *pFrame=GetParentFrame();
CView *pView=pFrame->GetActiveView();
pView->PostMessage(WM_DIALOG,IDCANCEL);
CDialog::OnCancel();
CDialog::OnCancel();
}
int SpeedCollect::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_pos=int(ControlParam.run_time);
m_pos_h=m_pos/3600;
m_pos_m=(m_pos-m_pos_h*3600)/60;
m_pos_s=m_pos-m_pos_h*3600-m_pos_m*60;
m_str.Format("%4d:%2d:%2d",m_pos_h,m_pos_m,m_pos_s);
strcpy(OldT," ");
strcpy(OldT1," ");
strcpy(OldT2," ");
strcpy(OldSpeed," ");
strcpy(OldT," ");
strcpy(OldCP," ");
return 0;
}
void SpeedCollect::OnDestroy()
{
KillTimer(1);
stopTimer();
OutAlarmLampOn(TRUE);
dcMemory.DeleteDC();
bitmap.Detach();
bitmap.DeleteObject();
CDialog::OnDestroy();
// TODO: Add your message handler code here
}
void SpeedCollect::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CWnd * pwnd=GetDlgItem(IDC_DISPLAY);
CPaintDC dc1(pwnd); // device context for painting
dc1.BitBlt(0,0,WRect.Width() ,WRect.Height(),&dcMemory,0,0,SRCCOPY);
ReleaseDC(&dc1);
dc.SetBkColor(GetSysColor(COLOR_BTNFACE));//设置背景颜色;
dc.TextOut(STARTX1,STARTY1, "时间(h:m:s):");
dc.TextOut(STARTX2,STARTY1, "车速(km/h):");
dc.TextOut(STARTX3,STARTY1, "转速 (rpm):");
CFont myFont;
CFont *pFont=GetFont();
LOGFONT lf;
if(pFont!=NULL)
pFont->GetObject(sizeof(LOGFONT),&lf);
else
::GetObject(GetStockObject(SYSTEM_FONT),sizeof(LOGFONT),&lf);
lf.lfHeight=21;
lf.lfWidth=7;
myFont.CreateFontIndirect(&lf);
CFont *PreFont=dc.SelectObject(&myFont);
CString Result;
double comp_v;
comp_v= (ControlParam.OtherParam.v_max*100)/(fr*6);
Result.Format (" %5.0f ",comp_v);
dc.TextOut(5,5, Result);
dc.TextOut(10,27, "(r/min)");
Result.Format (" %4.1f ",ControlParam.OtherParam.v_max);
dc.SetTextColor(RGB(0,128,128));
dc.TextOut(65,5, Result);
dc.TextOut(65,27, "(km/h)");
dc.SetTextColor(RGB(0,128,0));//绿
ReleaseDC(&dc);
//加入设定曲线
strcpy(OldT," ");
strcpy(OldT1," ");
strcpy(OldT2," ");
strcpy(OldSpeed," ");
strcpy(OldCP," ");
// Do not call CDialog::OnPaint() for painting messages
}
BOOL SpeedCollect::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
set_t=0;
set_t0 =int( ControlParam.run_time);
set_num=ControlParam.RunDataArray.start_num;
repaint=TRUE;
SampleParam.speed_meas_t=0.;
SampleParam.speed_meas_v=0.;
//=========获取及时时间======//
SYSTEMTIME tim;
::GetSystemTime(&tim);
xt = tim.wMinute*60*1000+tim.wSecond*1000+tim.wMilliseconds;
//===========================//
array_searchcurve.RemoveAll();//测量数据清除
mypaintpoint.RemoveAll();//绘图数据清除
num_i=0;
Change=FALSE;
////////////初始化dcmemory/////////////////////
CWnd * pwnd=GetDlgItem(IDC_DISPLAY);
pwnd->GetClientRect(&WRect);
PENREADY=FALSE;
UpdateData(FALSE);
////////////初始化dcmemory/////////////////////
CClientDC dc(pwnd);
dcMemory.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc,WRect.Width(),WRect.Height()); //创建一个和dc相同的dcmemory
dcMemory.SelectObject(&bitmap);
CRgn cliprgn;
cliprgn.CreateRectRgnIndirect(&WRect);
dcMemory.SelectClipRgn(&cliprgn);
ClearDcMemory();
//////////////////////////////////////////////
nTime = 0;
cur_sec = 0;
Sample(FALSE);
startTimer(10,FALSE);
SetTimer(1,200,NULL);//300
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void SpeedCollect::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==1)
{
while(_inp(SysParam.basein+0))count++;
// address to receive termination status
if(count==0)
{
CClientDC dc(this); // device context for painting
addrecord();
///加载模式曲线画实际图像
g_mutex.Lock();
int size = mypaintpoint.GetSize();
g_mutex.Unlock();
if(size>0)
x0=int(STARTX+MIDDOW_LENTH-2*mypaintpoint[size-1].t);//像素点平移
else
x0=int(STARTX+MIDDOW_LENTH-2*set_t0-2*SampleParam.speed_meas_t);
{
ClearDcMemory();
DrawCoordinate();
DrawGrid();
DrawSampleVCurve();//画速度
DrawSampleRVCurve();//画转速
DrawAll();
Invalidate(FALSE);
}
}
else
{
KillTimer(1);
stopTimer();
c_mutex.Lock();
ControlParam.run_time=SampleParam.speed_meas_t;
ControlParam.canrun_time+=SampleParam.count_t;
c_mutex.Unlock();
addrecord();
SaveFilex();
EndDialog(0);
}
}
CDialog::OnTimer(nIDEvent);
}
void SpeedCollect::addrecord()
{
//save file
//save file
CCSpeedSet *pSet=new CCSpeedSet();
try{
pSet->m_strFilter="speed_style=?";
pSet->m_test_no=ControlParam.speed_model;
if(pSet->Open())
{
pSet->AddNew();
//
//
pSet->m_test_no=ControlParam.speed_model;
pSet->m_test_date=COleDateTime::GetCurrentTime();
pSet->m_test_v=ControlParam.OtherParam.v_max;
pSet->m_test_t=ControlParam.run_time;
pSet->m_test_rv=(ControlParam.OtherParam.v_max)/((ControlParam.OtherParam.r)*2*PI);
if(pSet->Update())
TRACE("Record Added\n");
else
TRACE("Record Not Added\n");
pSet->Close();
}
}
catch(CDBException *p)
{
p->ReportError(MB_OK,0);
p->Delete();
}
delete pSet;
}
void SpeedCollect::SaveFilex()
{
g_mutex.Lock();//加锁
int lenth=array_searchcurve.GetSize();
CString ttt;
ttt.Format("%s\\data\\%s.ddx", exepath, ControlParam.speed_model);
CFile xzfile;
if(xzfile.Open(ttt,CFile::modeWrite))
{
int len;
len=xzfile.GetLength();
if(len<=0)
{
xzfile.SeekToEnd();
SPEEDSAMPLE point0;
point0.t=0.;
point0.test_v=0.;
xzfile.Write(&point0,sizeof(SPEEDSAMPLE));
}
xzfile.SeekToEnd();
for(int i=0; i<lenth; i++)
xzfile.Write(&array_searchcurve[i],sizeof(SPEEDSAMPLE));
}
xzfile.Close();
array_searchcurve.RemoveAll();
g_mutex.Unlock();//加锁
}
void SpeedCollect::ClearDcMemory()
{
dcMemory.SelectStockObject(BLACK_PEN);
dcMemory.BitBlt(0,0,WRect.Width() ,WRect.Height(),&dcMemory,0,0,WHITENESS);
dcMemory.BitBlt(0,0,WRect.Width() ,WRect.Height(),&dcMemory,0,0,WHITENESS);
zero=int(WRect.bottom-BOTTOM_LENTH);
dcMemory.MoveTo(0,int(zero));
dcMemory.LineTo(WRect.right,int(zero));
}
void SpeedCollect::DrawCoordinate()
{
dcMemory.MoveTo(STARTX+MIDDOW_LENTH,zero);
dcMemory.LineTo(STARTX+MIDDOW_LENTH,zero+60);
set_t =0;
while(x0+2*set_t0+2*set_t<STARTX-MIDDOW_LENTH)
set_t+=100;
CString lcx;
int dd, dd1,dd2;
dd = (int)set_t0 ;
dd1 = (int)set_t;
dd2 = (int)(set_t0 + set_t);
lcx.Format("%d + %d", dd, dd1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -