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

📄 safsview.cpp

📁 多类矩阵运算
💻 CPP
字号:
// SAFSView.cpp : implementation of the CSAFSView class
//

#include "stdafx.h"
#include "SAFS.h"

#include "SAFSDoc.h"
#include "SAFSView.h"



#include "ua300.h"
#pragma comment(lib,"ua300")

#include "sampleset.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

short TempData[13000],vol_Zero[12];
float CMetrix[6][6],Data[32000][12];
float temp[12];
float CM1[3][3],CM2[3][3],CM3[2][2],CM4[2][2];

HANDLE husb;
/////////////////////////////////////////////////////////////////////////////
// CSAFSView

IMPLEMENT_DYNCREATE(CSAFSView, CView)

BEGIN_MESSAGE_MAP(CSAFSView, CView)
	//{{AFX_MSG_MAP(CSAFSView)
	ON_COMMAND(ID_MENUITEM32771, OnStartSample)
	ON_WM_TIMER()
	ON_COMMAND(ID_MENUITEM32772, OnStop)
	ON_COMMAND(ID_MENUITEM32774, OnSampleSet)
	ON_WM_CREATE()
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_MENUITEM32775, OnCls)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSAFSView construction/destruction

CSAFSView::CSAFSView()
{
	int i1,i2;
	for(i1=0;i1<6;i1++)
		for(i2=0;i2<6;i2++)
			CMetrix[i1][i2]=0.0;


		CM1[0][0]=-103.586160;
		CM1[0][1]=0.508300;
		CM1[0][2]=-1.879100;
		CM1[1][0]=1.544600;
		CM1[1][1]=-105.747280;
		CM1[1][2]=3.827060;
		CM1[2][0]=3.138380;
		CM1[2][1]=-2.548080;
		CM1[2][2]=-119.612560;
	
		CM2[0][0]=92.287100;
		CM2[0][1]=-1.263680;
		CM2[0][2]=-4.594280;
		CM2[1][0]=-0.225300;
		CM2[1][1]=-87.036500;
		CM2[1][2]=-6.357540;
		CM2[2][0]=3.372240;
		CM2[2][1]=-1.638360;
		CM2[2][2]=-122.235600;

		CM3[0][0]=73.318760;
		CM3[0][1]=1.456660;
		CM3[1][0]=5.341100;
		CM3[1][1]=132.556440;
 
		CM4[0][0]=-56.467700;
		CM4[0][1]=-0.613780;
		CM4[1][0]=5.217120;
		CM4[1][1]=-108.638940;




m_pBitmap= new CBitmap;
m_pMemDC= new CDC;

}

CSAFSView::~CSAFSView()
{
	delete m_pBitmap;
	delete m_pMemDC;

}

BOOL CSAFSView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSAFSView drawing

void CSAFSView::OnDraw(CDC* pDC)
{
	CSAFSDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CBitmap* pOldBitmap;
	m_pMemDC->SelectObject(m_pBitmap);
	pDC->BitBlt(0,0,1024,768,m_pMemDC,0,0,SRCCOPY);
//	m_pMemDC->SelectObject(pOldBitmap);


}

/////////////////////////////////////////////////////////////////////////////
// CSAFSView printing

BOOL CSAFSView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CSAFSView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CSAFSView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CSAFSView diagnostics

#ifdef _DEBUG
void CSAFSView::AssertValid() const
{
	CView::AssertValid();
}

void CSAFSView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CSAFSDoc* CSAFSView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSAFSDoc)));
	return (CSAFSDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSAFSView message handlers

void CSAFSView::OnStartSample() 
{
	//设置解耦矩阵参数

	CMetrix[0][0]=0.01;
	CMetrix[0][1]=0.01;
	CMetrix[0][2]=0.01;
	CMetrix[0][3]=0.01;
	CMetrix[0][4]=0.01;
	CMetrix[0][5]=0.01;
	CMetrix[1][0]=0.01;
	CMetrix[1][1]=0.01;
	CMetrix[1][2]=0.01;
	CMetrix[1][3]=0.01;
	CMetrix[1][4]=0.01;
	CMetrix[1][5]=0.01;
	CMetrix[2][0]=0.01;
	CMetrix[2][1]=0.01;
	CMetrix[2][2]=0.01;
	CMetrix[2][3]=0.01;
	CMetrix[2][4]=0.01;
	CMetrix[2][5]=0.01;
	CMetrix[3][0]=0.01;
	CMetrix[3][1]=0.01;
	CMetrix[3][2]=0.01;
	CMetrix[3][3]=0.01;
	CMetrix[3][4]=0.01;
	CMetrix[3][5]=0.01;
	CMetrix[4][0]=0.01;
	CMetrix[4][1]=0.01;
	CMetrix[4][2]=0.01;
	CMetrix[4][3]=0.01;
	CMetrix[4][4]=0.01;
	CMetrix[4][5]=0.01;
	CMetrix[5][0]=0.01;
	CMetrix[5][1]=0.01;
	CMetrix[5][2]=0.01;
	CMetrix[5][3]=0.01;
	CMetrix[5][4]=0.01;
	CMetrix[5][5]=0.01;


	//开始采集数据
	husb = OpenUA300() ;
	if(husb == 0 ) 
	{
		MessageBox("USB采集器通讯错误,请检查设备是否接上" ) ;
		return ;
	}

	//数据接受缓冲区置空
	for( int i = 0 ; i < 13000 ; i ++ )
		TempData[i] = 0 ;


	//设置采集器硬件定时器工作状态,12通道1000Hz采样频率
	minit2( husb , 0 , 12 ,  500 , 0 ) ;
	SetTimer( 1 , 1000 , 0 ) ;

	

}

void CSAFSView::OnTimer(UINT nIDEvent) 
{
	readdata2( husb , TempData, 12288 ) ;//数据1024组,12通道
	DispCurve();
	CView::OnTimer(nIDEvent);
}

void CSAFSView::OnStop() 
{
//停止
	KillTimer(1) ;
	endread2( husb ) ;
	CloseUA300( husb ) ;
}

void CSAFSView::DispCurve()
{
	int i,j,m=50,n=226;int i1,i2;
	CClientDC dc(this);
	CPoint Fxpoint(m,n),Fypoint(m,n),Fzpoint(m,n),Mxpoint(m,n),Mypoint(m,n),Mzpoint(m,n);
	CPoint point1(m,n),point2(m,n),point3(m,n),point4(m,n),point5(m,n),point6(m,n);
	CPen pen1(PS_SOLID,1,RGB(0,255,64));
    CPen pen2(PS_SOLID,1,RGB(0,180,255));
	CPen pen3(PS_SOLID,1,RGB(0,255,64));
	CPen pen4(PS_SOLID,1,RGB(255,0,255));
	CPen pen5(PS_SOLID,1,RGB(255,255,0));
	CPen pen6(PS_SOLID,1,RGB(0,255,255));
	CString txt[12];	

	Invalidate(false) ;
	UpdateWindow() ;
	for(i=0;i<1024;i++)
		{
			for(i1=0;i1<12;i1++)
				Data[i][i1]=0.0;
		}
//对数组赋值与解耦,赋值1024组
	for(i=0;i<1024;i++)
		{
			for(j=0;j<12;j++)
 				temp[j]=(float)((TempData[12*i+j]-2048-vol_Zero[j])*2.442);
 
			//对通道电压进行解耦运算,其中CMetrix[i][j]为一个3×3的解耦矩阵
			//0.0005为放大2000倍的修正系数(0.0005=1/2000)
			//计算得到的力单位为Kg
			for (i1=0;i1<3;i1++)
				{
					for (i2=0;i2<3;i2++)
							Data[i][i1]+=0.0005*temp[i1]*CM1[i1][i2];			
				}

			//对通道电压进行解耦运算,其中CM2[i][j]为一个3×3的解耦矩阵
			for (i1=3;i1<6;i1++)
				{
					for (i2=0;i2<3;i2++)
							Data[i][i1]+=0.0005*temp[i1]*CM2[i1-3][i2];			
				}

			//对通道电压进行解耦运算,其中CM3[i][j]为一个2×2的解耦矩阵

			for (i1=6;i1<8;i1++)
				{
					for (i2=0;i2<2;i2++)
							Data[i][i1]+=0.0005*temp[i1]*CM3[i1-6][i2];			
				}

			//对通道电压进行解耦运算,其中CM4[i][j]为一个2×2的解耦矩阵

			for (i1=8;i1<10;i1++)
				{
					for (i2=0;i2<2;i2++)
							Data[i][i1]+=0.0005*temp[i1]*CM4[i1-8][i2];			
				}

		}	

	//显示960点的三维力曲线 960
	//计算显示区域的大小
		dc.SetTextColor(RGB(255,250,0));
		dc.SetBkMode(OPAQUE);
		dc.SetBkColor(RGB(0,0,0));
	for(i=0;i<960;i++)
	{
	//Fx1
	dc.SelectObject(pen1);
	Fxpoint.x=i+50;
	Fxpoint.y=(int)(-Data[i][0]/100+226);
	dc.MoveTo(point1);
	dc.LineTo(Fxpoint);
	point1=Fxpoint;

	//Fy1
	dc.SelectObject(pen2);
	Fypoint.x=i+50;
	Fypoint.y=(int)(-Data[i][1]/100+226);
	dc.MoveTo(point2);
	dc.LineTo(Fypoint);
	point2=Fypoint;

	//Fz1
	dc.SelectObject(pen3);
	Fzpoint.x=i+50;
	Fzpoint.y=(int)(-Data[i][2]/100+226);
	dc.MoveTo(point3);
	dc.LineTo(Fzpoint);
	point3=Fzpoint;

	//Fx2
	dc.SelectObject(pen4);
	Mxpoint.x=i+50;
	Mxpoint.y=(int)(-Data[i][3]/100+226);
	dc.MoveTo(point4);
	dc.LineTo(Mxpoint);
	point4=Mxpoint;

	//Fy2
	dc.SelectObject(pen5);
	Mypoint.x=i+50;
	Mypoint.y=(int)(-Data[i][4]/100+226);
	dc.MoveTo(point5);
	dc.LineTo(Mypoint);
	point5=Mypoint;

	//Fz2
	dc.SelectObject(pen6);
	Mzpoint.x=i+50;
	Mzpoint.y=(int)(-Data[i][5]/100+226);
	dc.MoveTo(point6);
	dc.LineTo(Mzpoint);
	point6=Mzpoint;
	}

		//显示传感器的数据
	for (i=0;i<12;i++)
		{
			txt[i].Format("%8.0f",Data[1][i]);
			txt[i].TrimLeft();
			txt[i].TrimRight();
		}
	dc.SetBkMode(TRANSPARENT);
	dc.SetTextColor(RGB(128,0,255));
	dc.TextOut(110,530,txt[0]);
	dc.TextOut(110,570,txt[1]);
	dc.TextOut(110,610,txt[2]);
	dc.TextOut(350,530,txt[3]);
	dc.TextOut(350,570,txt[4]);
	dc.TextOut(350,610,txt[5]);
	dc.TextOut(590,530,txt[6]);
	dc.TextOut(590,570,txt[7]);
	dc.TextOut(830,530,txt[8]);
	dc.TextOut(830,570,txt[9]);

}

void CSAFSView::OnSampleSet() 
{
//
	CSampleSet CSSet;
	if (CSSet.DoModal()==IDOK)
	{
	}	
}

void CSAFSView::OnCreateBitmap()
{
	CString strtime0,strtime1,strtime2,strtime3,strtime4,strtime5,strtime6,strtime7;
	CString strtime8,strtime9,strtime10,strtime11,strtime12,strtime13,strtime14;
	CBrush brush;
	brush.CreateStockObject(WHITE_BRUSH);
	CRect rect(-1,-1,1024,768);

	CBitmap* pOldBitmap=m_pMemDC->SelectObject(m_pBitmap);

	brush.CreateStockObject(WHITE_BRUSH);
	m_pMemDC->FillRect(rect,&brush);
	m_pMemDC->SelectStockObject(WHITE_BRUSH);
	m_pMemDC->SetBkMode(TRANSPARENT);

	m_pMemDC->Rectangle(0,0,1024,768);
	
	CPen pen(PS_SOLID,3,RGB(255,107,0));
	CPen xpen1(PS_DOT,1,RGB(44,86,86));
	CPen pen1(PS_SOLID,1,RGB(255,255,0));
	CPen blackpen(PS_SOLID,1,RGB(0,0,0));
	CPen bluepen(PS_SOLID,1,RGB(0,0,255));
    CPen xpen(PS_SOLID,2,RGB(255,255,255));
	CPen redpen(PS_SOLID,1,RGB(255,0,0));
	CPen whitepen(PS_SOLID,1,RGB(150,155,155));	
	
	int j=0;
	CString str_force[6];

	


	m_pMemDC->SelectObject(&xpen);
	m_pMemDC->SelectStockObject(WHITE_PEN);
	m_pMemDC->SetBkMode(TRANSPARENT);
	m_pMemDC->Rectangle(0,0,1024,768);
 	m_pMemDC->SelectObject(&bluepen);
	m_pMemDC->SetBkMode(TRANSPARENT);
	m_pMemDC->Rectangle(50,10,1012,498);

	m_pMemDC->Rectangle(50,518,1012,638);






for (int scale=0;scale<19;scale++)
{
// 	m_pMemDC->SelectObject(&bluepen);
//	m_pMemDC->MoveTo((scale*50+50),498);
//	m_pMemDC->LineTo((scale*50+50),503);

	
	m_pMemDC->SelectObject(&xpen1);
	m_pMemDC->MoveTo((scale*50+100),498);////竖线
	m_pMemDC->LineTo((scale*50+100),10);
}


	m_pMemDC->SelectObject(&xpen1);
	m_pMemDC->MoveTo(50,64);
	m_pMemDC->LineTo(1012,64);

	m_pMemDC->MoveTo(50,118);
	m_pMemDC->LineTo(1012,118);

	m_pMemDC->MoveTo(50,172);
	m_pMemDC->LineTo(1012,172);


	m_pMemDC->MoveTo(50,280);
	m_pMemDC->LineTo(1012,280);

	m_pMemDC->MoveTo(50,334);
	m_pMemDC->LineTo(1012,334);

	m_pMemDC->MoveTo(50,388);
	m_pMemDC->LineTo(1012,388);



	m_pMemDC->MoveTo(50,442);
	m_pMemDC->LineTo(1012,442);	

//	m_pMemDC->MoveTo(50,496);
//	m_pMemDC->LineTo(1012,496);

	m_pMemDC->SelectObject(&blackpen);
	m_pMemDC->MoveTo(50,226);
	m_pMemDC->LineTo(1012,226);	


	m_pMemDC->MoveTo(50,555);
	m_pMemDC->LineTo(1012,555);
	m_pMemDC->MoveTo(50,594);
	m_pMemDC->LineTo(1012,594);

	m_pMemDC->MoveTo(290,518);//竖线
	m_pMemDC->LineTo(290,638);

	m_pMemDC->MoveTo(530,518);
	m_pMemDC->LineTo(530,638);

	m_pMemDC->MoveTo(770,518);
	m_pMemDC->LineTo(770,638);




	m_pMemDC->SetTextColor(RGB(0,0,128));
	m_pMemDC->TextOut(7,2,"图形");
	m_pMemDC->SetTextColor(RGB(255,0,0));
	m_pMemDC->TextOut(6,20,"Fx1");
	m_pMemDC->SetTextColor(RGB(0,128,255));
	m_pMemDC->TextOut(6,40,"Fy1");
	m_pMemDC->SetTextColor(RGB(0,255,0));
	m_pMemDC->TextOut(6,60,"Fz1");
	m_pMemDC->SetTextColor(RGB(255,0,255));
	m_pMemDC->TextOut(6,80,"Fx2");
	m_pMemDC->SetTextColor(RGB(128,0,255));
	m_pMemDC->TextOut(6,100,"Fy2");
	m_pMemDC->SetTextColor(RGB(0,0,64));
	m_pMemDC->TextOut(6,120,"Fz2");

	m_pMemDC->TextOut(30,216,"0");


	m_pMemDC->SetTextColor(RGB(128,0,255));
	m_pMemDC->TextOut(60,530,"Fx1=");
	m_pMemDC->TextOut(60,570,"Fy1=");
	m_pMemDC->TextOut(60,610,"Fz1=");
	m_pMemDC->TextOut(300,530,"Fx2=");
	m_pMemDC->TextOut(300,570,"Fy2=");
	m_pMemDC->TextOut(300,610,"Fz2=");
	m_pMemDC->TextOut(540,530,"Fx3=");
	m_pMemDC->TextOut(540,570,"Fy3=");
	m_pMemDC->TextOut(780,530,"Fx4=");
	m_pMemDC->TextOut(780,570,"Fy4=");



	m_pMemDC->SetTextColor(RGB(0,0,128));
	m_pMemDC->TextOut(6,460,"时间");
	m_pMemDC->TextOut(6,480,"(ms)");
	m_pMemDC->TextOut(40,500,"0");
	

//for (int scale=0;scale<12;scale++)
//{
//	strtime0.Format("%-6.0d",(1000*((flag_ScreenNumber-1)*550+50*scale)/samplefrq));
//	m_pMemDC->TextOut((scale*50+50)-15,672,strtime0);
//}

int flag_ScreenNumber=1,samplefrq=1;
for (scale=0;scale<20;scale++)
{
	strtime0.Format("%-6.0d",(1*((flag_ScreenNumber-1)*550+50*scale)/samplefrq));
	m_pMemDC->TextOut((scale*50+50)-15,500,strtime0);
}
	m_pMemDC->SelectObject(pOldBitmap);

}

int CSAFSView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	CDC* pDC=GetDC();
	m_pMemDC->CreateCompatibleDC(pDC);
	m_pBitmap->CreateCompatibleBitmap(pDC,1024,768);
	OnCreateBitmap();
	ReleaseDC(pDC);
	
/*	m_nMaxX=GetSystemMetrics(SM_CXSCREEN);
	m_nMaxY=GetSystemMetrics(SM_CYSCREEN);
	m_LBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
	m_sBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
	m_mBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
   	m_fdBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
   	m_nBitmap->CreateCompatibleBitmap(pDC,1024,768);
    OnCreateFangDaCoordinate();
	OnCreateLeisureCoordinate();
	OnCreateSingleCoordinate();
	OnCreateMultiCoordinate();
	OnCreateCOPCoordinate();
*/	
	return 0;
}

void CSAFSView::OnFileSave() 
{
	CStdioFile savedata;
	CString FileName,number,data1,data2,m_UserName,m_Sex; 
	int n,endpointtime,samplefrq,endtimeset;float Force_Fz_threshold;
CFileDialog SaveFileDialog(TRUE,"TXT");
SaveFileDialog.m_ofn.lpstrTitle="保存新数据文件";
SaveFileDialog.m_ofn.lpstrFilter="数据文件(*.TXT)\0*.TXT\0";
if(SaveFileDialog.DoModal()==IDOK)	
FileName=SaveFileDialog.GetPathName();
else
	FileName="temp.tmp";
	

	endpointtime=1024;
	samplefrq=1000;
	m_UserName="User";
	m_Sex="male";
	endtimeset=10;
	Force_Fz_threshold=0;


	savedata.Open(FileName,CFile::modeCreate|CFile::modeWrite|CFile::typeText);
	savedata.SeekToEnd();

	data1.Format("%8d",endpointtime);
	savedata.WriteString(data1);

	savedata.WriteString("\n");
	data1.Format("%5d",samplefrq);
	savedata.WriteString(data1);
	savedata.WriteString("\n");

	savedata.WriteString(m_UserName);
	savedata.WriteString("\n");

	savedata.WriteString(m_Sex);
	savedata.WriteString("\n");

	data1.Format("%8d",endtimeset);
	savedata.WriteString(data1);
 	savedata.WriteString("\n");

	data1.Format("%8.0f",Force_Fz_threshold);
	savedata.WriteString(data1);
 	savedata.WriteString("\n");

	for(n=0;n<endpointtime;n++)
	{
	data2.Format("%-8.2f %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f %-8.2f  \n",Data[n][0],Data[n][1],Data[n][2],Data[n][3],Data[n][4],Data[n][5],Data[n][6],Data[n][7],Data[n][8],Data[n][9]);
	savedata.WriteString(data2);
	}
}

void CSAFSView::OnCls() 
{
	Invalidate(false) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -