⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stickslipview.cpp

📁 这是用Visual C++编写的步进电机驱动控制程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -