📄 stickslipview.cpp
字号:
// StickSlipView.cpp : implementation of the CStickSlipView class
//
#include "stdafx.h"
#include "StickSlip.h"
#include "Inspector.h"
#include "StickSlipDoc.h"
#include "StickSlipView.h"
#include "MainFrm.h"
#include "InpectItem.h"
#include "InputdataDlg.h"
#include "DirectPort.h"
#include <conio.h>
#include <stdio.h>
#include <windowsx.h>
#include <fstream.h>
//#include "6503dll.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int aTimes = 1;//与动画有关
//CEvent AnimateThread;//电机转动线程
int XLength=2000,XUnit=50,XScale=10;
int FYLength=2500,FYUnit=50,FYScale=100;
int DYLength=1200,DYUnit=20,DYScale=10;
BOOL STOPa;
//多媒体定时器有关
UINT timerID;
UINT wTimerRes;
void CALLBACK Proc(UINT timerID,UINT msg,
DWORD dwUser,DWORD dw1,DWORD dw2);
struct _RING0DATA
{
DWORD mcr0,mcr2,mcr3;
unsigned short BaseMemory;
unsigned short ExtendedMemory;
}r0Data;
/////////////////////////////////////////////////////////////////////////////
// CStickSlipView
IMPLEMENT_DYNCREATE(CStickSlipView, CFormView)
BEGIN_MESSAGE_MAP(CStickSlipView, CFormView)
//{{AFX_MSG_MAP(CStickSlipView)
ON_BN_CLICKED(IDC_BUT_START, OnButtonStart)
ON_BN_CLICKED(IDC_SHOW_GRAPH, OnShowGraph)
ON_BN_CLICKED(IDC_SAVE_DATA, OnSaveData)
ON_BN_CLICKED(IDC_SAVE_IMAGE, OnSaveImage)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_BN_CLICKED(IDC_READ_DATA, OnReadData)
ON_BN_CLICKED(IDC_MOVE_LDIR, OnMoveLdir)
ON_BN_CLICKED(IDC_MOVE_RDIR, OnMoveRdir)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
ON_MESSAGE(WM_ANIMATE,OnPlayAnimate)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStickSlipView construction/destruction
CStickSlipView::CStickSlipView()
: CFormView(CStickSlipView::IDD)
{
//{{AFX_DATA_INIT(CStickSlipView)
m_movedir = -1;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CStickSlipView::~CStickSlipView()
{
timeKillEvent( timerID);
timeEndPeriod(wTimerRes);
}
void CStickSlipView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStickSlipView)
DDX_Control(pDX, IDC_RUN_PROGRESS, m_runProgress);
DDX_Control(pDX, IDB_BMPLRUN2, m_lrun2);
DDX_Control(pDX, IDC_BMPLRUN1, m_lrun1);
DDX_Control(pDX, IDC_BMPLRUN3, m_lrun3);
DDX_Control(pDX, IDC_BMPRRUN3, m_rrun3);
DDX_Control(pDX, IDC_BMPRRUN2, m_rrun2);
DDX_Control(pDX, IDC_BMPRRUN1, m_rrun1);
DDX_Control(pDX, IDC_DISPLACEMENT, m_displace);
DDX_Control(pDX, IDC_MOTOR_RPM, m_rpm);
DDX_Radio(pDX, IDC_MOVE_LDIR, m_movedir);
//}}AFX_DATA_MAP
}
BOOL CStickSlipView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CStickSlipView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
CreateDisplay();
double m_time=120;
InitialCtrl();
}
/////////////////////////////////////////////////////////////////////////////
// CStickSlipView printing
BOOL CStickSlipView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CStickSlipView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CStickSlipView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CStickSlipView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CStickSlipView diagnostics
#ifdef _DEBUG
void CStickSlipView::AssertValid() const
{
CFormView::AssertValid();
}
void CStickSlipView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CStickSlipDoc* CStickSlipView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStickSlipDoc)));
return (CStickSlipDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CStickSlipView message handlers
UINT ThreadRunMotor(LPVOID param)
{
while(!STOPa)
{
//::PostMessage
::SendMessage((HWND)param,WM_ANIMATE,0,0);
Sleep(500);
}
return 0;
}
void CStickSlipView::OnPlayAnimate()
{
if(m_movedir == 0)//ccw
{
GetDlgItem(IDC_BMPLRUN1)->ShowWindow((aTimes&1)==1);
GetDlgItem(IDC_BMPLRUN2)->ShowWindow((aTimes&2)==2);
GetDlgItem(IDC_BMPLRUN3)->ShowWindow((aTimes&4)==4);
}else
{
GetDlgItem(IDC_BMPRRUN1)->ShowWindow((aTimes&1)==1);
GetDlgItem(IDC_BMPRRUN2)->ShowWindow((aTimes&2)==2);
GetDlgItem(IDC_BMPRRUN3)->ShowWindow((aTimes&4)==4);
}
aTimes = aTimes<<1;
if(aTimes >= 8) aTimes = 1;
}
void CStickSlipView::InitialCtrl()
{
m_displace.SetCurSel(1);
IsShowData=FALSE;
aTimes=1;
STOPa=TRUE;
XLength=2000,XUnit=50,XScale=10;
FYLength=2500,FYUnit=50,FYScale=100;
DYLength=1200,DYUnit=20,DYScale=10;
Is_Stop=TRUE;
m_rpm.SetCurSel(1);
m_runProgress.SetPos(0);
PointNum=0;
m_time=0.0;
m_movedir = 0; //初始化m_movedir = 0选中方向向左;m_movedir = 1选中方向向右
GetDlgItem(IDC_BMPLRUN1)->ShowWindow(SW_SHOW);
GetDlgItem(IDC_BMPLRUN2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BMPLRUN3)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BMPRRUN1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BMPRRUN2)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BMPRRUN3)->ShowWindow(SW_HIDE);
DataArray.RemoveAll();
//DataArray.SetSize(1200,20);
GetDlgItem(IDC_SHOW_GRAPH)->EnableWindow(FALSE);
GetDlgItem(IDC_BUT_START)->EnableWindow(TRUE);
UpdateData(FALSE);
}
void CStickSlipView::OnButtonStart()
{
//修改
x=0;
xl=0;
xh=0;
y=0;
yl=0;
yh=0;
Fvalue=0.000000;
m_PointData.displace=0;
m_PointData.force=0;
m_PointData.pointtime=0;
// TODO: Add your control notification handler code here
CString temp,temp1;
//转速
m_rpm.GetLBText(m_rpm.GetCurSel(),temp);
m_displace.GetLBText(m_displace.GetCurSel(),temp1);
//double m_time;
m_time=atof(temp1)/(atof(temp)*4/60);
///////////////////////////////////
PointNum=((int)m_time)*1000/PERIOD;
// UpdateData(TRUE);
AfxBeginThread(ThreadRunMotor,GetSafeHwnd(),0,0);
STOPa = FALSE;
m_runProgress.SetPos(0);
m=1;
Index=0;
chushihua();
ChuSH8253F();
//////////////////////////////////////////////////////////////////////////
//多媒体定时器安装
TIMECAPS timecaps;
int TimerResolution;
if (timeGetDevCaps(&timecaps,sizeof(TIMECAPS))==TIMERR_NOERROR )
{
wTimerRes=min(max(timecaps.wPeriodMin,1),timecaps.wPeriodMax);
timeBeginPeriod(wTimerRes);
}
TimerResolution=PERIOD;
timerID=timeSetEvent(TimerResolution,wTimerRes,Proc,30,TIME_PERIODIC);
//////////////////////////////////////////////////////////////////////////
//硬件操作
/* memset(&r0Data,0,sizeof(r0Data));
DP_UseDirectPortMode(TRUE);
DP_OutpB(0x70,0x15);
r0Data.BaseMemory = DP_InpB(0x71);
DP_OutpB( 0x70, 0x16 );
r0Data.BaseMemory += DP_InpB(0x71) << 8;
DP_OutpB( 0x70, 0x17 );
r0Data.ExtendedMemory = DP_InpB( 0x71 );
DP_OutpB( 0x70, 0x18 );
r0Data.ExtendedMemory += _inp(0x71) << 8;
CString str;
str.Format("Base memory = %dK \nExtended memory = %dK\n", r0Data.BaseMemory,
r0Data.ExtendedMemory);
*/ // AfxMessageBox(str);
//////////////////////////////////////////////////////////////////////////
GetDlgItem(IDC_BUT_START)->EnableWindow(FALSE);
Is_Stop=FALSE;
}
void CStickSlipView::OnShowGraph()
{
// TODO: Add your control notification handler code here
// CRect m_ForceWave;
//CRect m_DisplaceWave;
//////////////////
if (IsShowData)
{
int ret = AfxMessageBox("要清除前一次测量结果吗?",MB_YESNO);
if(IDNO == ret)
return;
else
{ // pView->InitialWindow();
// pView->UpdateData(FALSE);
}
}
CString temp,temp1;
//转速
m_rpm.GetLBText(m_rpm.GetCurSel(),temp);
m_displace.GetLBText(m_displace.GetCurSel(),temp1);
//double m_time;
m_time=atof(temp1)/(atof(temp)*4/60);
XScale=10;
XLength=(int)m_time*XScale;
XUnit=(int)XLength/40; //XUnit=(int)XLength/((int)m_time);
DYScale=10;
DYLength=(int)atof(temp1)*DYScale;
DYUnit=(int)DYLength/120;
CreateDisplay();
///////////////////
CMainFrame * pMain=(CMainFrame *)AfxGetApp()->m_pMainWnd;
CStickSlipView* pView=(CStickSlipView*)pMain->GetActiveView();
CInpectItem *pCItem = new CInpectItem;
CInpectItem::m_CurrentCirItem = ItemList.AddTail(pCItem);
pCItem->RDataArray.RemoveAll();
pCItem->RDataArray.SetSize(DataArray.GetSize(),20);
for(int i=0;i<DataArray.GetSize();i++)
{
pCItem->RDataArray[i].displace=DataArray[i].displace*DYScale;
pCItem->RDataArray[i].force=DataArray[i].force*FYScale;
pCItem->RDataArray[i].pointtime=DataArray[i].pointtime*XScale*PERIOD/1000;
}
pCItem->DataSampler();
// pView->SetList(pCItem);
//pView->m_CircleValue =pCItem->CircleValue;
//pView->m_Ampel=pCItem->Ampel;
//pView->m_SurfaceValue=pCItem->SurfaceValue;
//pView->m_datapoint=pCItem->FilterNum;
//pView->m_filter=7200;
IsShowData=TRUE;
pView->UpdateData(FALSE);
}
void CStickSlipView::OnSaveData()
{
// TODO: Add your control notification handler code here
if (DataArray.GetSize()<=0)
{
MessageBox("数组为空,未获得采样数据!");
return ;
}
char szFileFilter[]=
"txt(*.txt)|*.txt|"
"All File(*.*)|*.*||";
CString m_dataPath;
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK)
{
m_dataPath=dlg.GetPathName();
//CString PathName
//m_dataPath +=".txt";
WriteData(m_dataPath);
MessageBox("数据已存入指定路径?","成功", MB_OK);
// if(int re = AfxMessageBox("数据已存储, 是否察看数据文件?",
// MB_ICONQUESTION | MB_YESNO,NULL) == IDYES)
// WinExec("notepad " + m_dataPath,SW_SHOW);
UpdateData(FALSE);
}
}
void CStickSlipView::OnSaveImage()
{
// TODO: Add your control notification handler code here
//////////////////
char szFileFilter[]=
"bmp(*.bmp)|*.bmp|"
"All File(*.*)|*.*||";
CString m_imagePath="";
CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
if(dlg.DoModal()==IDOK)
{
m_imagePath=dlg.GetPathName();
}
else return;
//UpdateData(FALSE);
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
///////////////////////////////////
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
// bm.GetBitmapBits(size,lpData); //此函数在处理5-5-5模式的16位色下会出现颜色混乱
/////////////////////////////
//static int filecount=0;
CString name=".bmp";
//name.Format("%04d",filecount++);
name=m_imagePath+name;
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
}
GlobalFreePtr(lpData);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -