?? mastercontroldlg.cpp
字號:
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnHomey()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GoToPos( XCurrent, 0 , ZCurrent );
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnHomez()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GoToPos( XCurrent, YCurrent, 0 );
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnSethome()
{
m_XLocVar = XCurrent = 0;
m_YLocVar = YCurrent = 0;
m_ZLocVar = ZCurrent = 0;
XDigPos =0; YDigPos = 0; ZDigPos = 0;
m_LEDXHome.Depress(TRUE);
m_LEDYHome.Depress(TRUE);
m_LEDZHome.Depress(TRUE);
UpdateData(false);
}
BOOL CMasterControlDlg::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::Create(IDD, pParentWnd);
}
int CMasterControlDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
return 0;
}
void CMasterControlDlg::OnDeltaposCurspin(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CMasterControlDlg::OnDispoff()
{
DispOn = false;
m_DispOnLed.Depress( false );
m_DispOffLed.Depress( true );
}
void CMasterControlDlg::OnDispon()
{
DispOn = true;
m_DispOnLed.Depress( true );
m_DispOffLed.Depress( false );
}
void CMasterControlDlg::DoRun() // gets called from OnIdle();
{
Line data;
if( !RUN ) return;
KillTimer(1);
while ( curline < lastline )
{
data = DecodeLine( curline );
if (data.xloc < 9999) m_XLocVar = data.xloc;
else m_XLocVar = XCurrent;
if( data.yloc < 9999) m_YLocVar = data.yloc;
else m_YLocVar = YCurrent;
if( data.zloc < 9999) m_ZLocVar = data.zloc;
else m_ZLocVar = ZCurrent;
if( data.ival < 9999) m_ILocVar = data.ival;
else m_ILocVar = XCurrent;
if( data.jval < 9999) m_JLocVar = data.jval;
else m_JLocVar = YCurrent;
if( data.kval < 9999) m_KLocVar = data.kval;
else m_KLocVar = ZCurrent;
if( data.gmode < 9999 ) GMode = data.gmode;
if( data.tool != 9999 && !Simulate )
{
if( ToolChange )
{
GoToPos( XCurrent, YCurrent, ToolChangeZ );
GoToPos( ToolChangeX , ToolChangeY, ToolChangeZ);
}
AfxMessageBox( "Tool Change" , MB_OK , 0 );
if( ToolChange )
{
GoToPos( XCurrent, YCurrent, ToolChangeZ );
GoToPos( XCurrent, YCurrent, ZCurrent );
}
}
//if( data.rval < 9999)
//{
// AfxMessageBox( "R Data found. Aborting..." );
// RUN = FALSE;
// return;
//}
if( GMode == 4) Sleep( 250 );
else
if( GMode == 3 && Axis == 1) G03(); // circular CCW
else
if( GMode == 2 && Axis == 1) G02(); // circular CW
else
if( GMode == 3 && Axis == 2) G032(); // circular CCW
else
if( GMode == 2 && Axis == 2) G022();
else
if( GMode == 3 && Axis == 3) G033(); // circular CCW
else
if( GMode == 2 && Axis == 3) G023();
else
GoToPos( m_XLocVar, m_YLocVar, m_ZLocVar); // Linear
curline++;
if( curline >= lastline ) break;
if( !vector[curline] ) break;
if( !Enable ) break;
}
m_CurLineInt = curline;
if( !Simulate && Simulated)
{ int left = (int) (TimeCalc - TimeEstimate);
int a = (int) (left / 3600);
int b = (int) (left-(a*3600)) / 60;
int c = (int) left - (a*3600) - (b*60);
m_TimeLeft.Format( "%u:%u:%u" , a, b, c);
}
UpdateData(FALSE);
UpdateWindow();
//if( rightnow - started > 3962 ) curline++; // protection line
if( !Simulate) SetTimer(1, StopDelay ,NULL); else SetTimer( 1,1,NULL );
if( Simulate && curline >= lastline ) EndSimulate();
if( curline >= lastline)
{
m_Running.Depress( false);
RUN = FALSE;
RouterOff();
Axis = 1;
GMode = 0;
if( Automatic ) Emergency();
AfxMessageBox( "Program Complete" );
}
}
void CMasterControlDlg::OnTimer(UINT nIDEvent)
{
if( nIDEvent == 2 )
{
if( EStopFlash ) EStopFlash = false; else EStopFlash = true;
if( EStopFlash ) m_LEDEmerg.Depress(false);
else m_LEDEmerg.Depress(true);
CDialog::OnTimer(nIDEvent);
}
DoRun();
CDialog::OnTimer(nIDEvent);
}
void CMasterControlDlg::OnRun()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
if( !FileLoaded ) return;
TimeEstimate = 0;
m_Running.Depress( true );
SetTimer( 1, 250, NULL );
RUN = true;
}
void CMasterControlDlg::OnPause()
{
m_Running.Depress( false );
RUN = false;
KillTimer( 1 );
//terp.SetInterp( 0, 100,50,0 ); // set pos 1 to 0,0,0
//terp.SetInterp( 1, 0,0,10 );
//terp.SetInterp( 2, -100,50,20 );
//float t =.5;
//terp.DoInterp( t );
}
void CMasterControlDlg::DrawTo()
{
static int x = 0, y=0;
if( !FileLoaded ) return;
if( x == (int) XCurrent && y == (int) YCurrent ) return;
CDC *dc = m_Display.GetDC();
dc->MoveTo( x , 179 - y );
int nx = (int) ( XCurrent * bitmapX );
int ny = (int) ( YCurrent * bitmapY );
int nz;
if (ZCurrent < 0) nz = (int) ( ZCurrent * bitmapZ );
else
nz = 255;
if( nz < 0) nz = -nz;
if( nz > 100) nz = 255;
nz = 128-nz;
CPen BlackPen( PS_SOLID, 0, RGB( nz, nz, nz ));
CPen RedPen( PS_SOLID, 0, RGB( 128-nz, 0,0));
CPen *oldPen;
if( Simulate ) oldPen = dc->SelectObject(&BlackPen);
else
oldPen = dc->SelectObject(&RedPen);
if( nx > 179) nx = 179;
if( ny > 179) ny = 179;
if( nx < 0 ) nx = 0;
if( ny < 0 ) ny = 0;
x = nx; y = ny;
dc->LineTo( nx, 179 - ny );
dc->SelectObject( oldPen );
m_Display.ReleaseDC( dc );
//dc->DeleteDC();
}
void CMasterControlDlg::OnSimulate()
{
if( !FileLoaded ) return;
Simulate = true;
curline = 0;
TimeEstimate = 0;
RUN = true;
SetTimer( 1,1,NULL );
}
void CMasterControlDlg::EndSimulate()
{
Simulate = false;
Simulated = true;
RUN = false;
KillTimer(1);
TimeCalc = TimeEstimate;
int a = (int) TimeCalc / 3600;
int b = (int) (TimeCalc - (a*3600) ) / 60;
int c = (int) TimeCalc - (a*3600) - (b*60);
m_Estimate.Format( "%d:%d:%d" , a, b, c);
UpdateData( false ); // set the estimed time here with TimeEstimate
curline = 0;
TimeEstimate = 0;
m_XLocVar = XCurrent = 0;
m_YLocVar = YCurrent = 0;
m_ZLocVar = ZCurrent = 0;
XDigPos =0; YDigPos = 0; ZDigPos = 0;
m_LEDXHome.Depress(TRUE);
m_LEDYHome.Depress(TRUE);
m_LEDZHome.Depress(TRUE);
UpdateData(false);
m_LEDRoute.Depress(false);
Spindle = false;
}
void CMasterControlDlg::OnReset()
{
m_CurLineInt = 0;
curline = 0;
UpdateData( false );
}
double CMasterControlDlg::GetTime()
{
LARGE_INTEGER now;
double seconds = 0;
QueryPerformanceCounter( &now );
__int64 temp = now.QuadPart;
seconds = ((double)temp) / frequency.QuadPart;
return seconds;
}
double CMasterControlDlg::CalcLatency()
{
double start = GetTime();
XPulse = true; YPulse = true; ZPulse = true;
DoPulse();
double now = GetTime();
return now - start;
}
void CMasterControlDlg::G02()
{
double AngStart,AngFinish,AngIterate,XIterate,YIterate,ZIterate;
double XOffset,YOffset,ZOffset,Radius,TotalAngle,DeltaAngle;
XOffset = XCurrent - m_ILocVar; // find start Angle
YOffset = YCurrent - m_JLocVar;
ZOffset = ZCurrent - m_ZLocVar;
Radius = sqrt( pow(XOffset,2) + pow(YOffset,2) );
AngStart = atan2( XOffset , YOffset ); // this should work for all quadrants;
XOffset = m_XLocVar - m_ILocVar; // and end angle;
YOffset = m_YLocVar - m_JLocVar;
ZOffset = m_ZLocVar - ZCurrent;
AngFinish = atan2( XOffset, YOffset );
if( AngFinish >= AngStart ) AngFinish -= 6.2831852; // two times PI
if( Radius == 0 ) return; // we now have a 3d Radius value
TotalAngle = AngStart - AngFinish;
if( TotalAngle < 0) TotalAngle += 6.2831852;
if( TotalAngle == 0) TotalAngle = 6.2831852;
DeltaAngle = TotalAngle / ((6.2831852 * Radius * ( TotalAngle / 6.2831852)) / MaxRes);
ZIterate = ZOffset / ( TotalAngle / DeltaAngle );
// angle step for max resolution detremined from circumferance / Maximun resolution.
AngIterate = AngStart; XIterate = XCurrent; YIterate = YCurrent;
double ZHold = 0;
double ZHolder = ZCurrent;
while( AngIterate > ( AngFinish - DeltaAngle))
{
YIterate = (Radius * cos( AngIterate)) + m_JLocVar; // new x
XIterate = (Radius * sin( AngIterate)) + m_ILocVar; // new Y
double dist = XIterate - XCurrent;
double dist1 = YIterate - YCurrent;
if( dist < 0) dist = -dist;
if( dist1 < 0) dist1 = -dist1;
ZHold += ZIterate;
if( dist >= MaxRes || dist1 >= MaxRes)
GoToPos( XIterate, YIterate, ZHolder + ZHold); // go there
AngIterate -= DeltaAngle; // next angle
}
GoToPos( m_XLocVar, m_YLocVar, m_ZLocVar );
}
void CMasterControlDlg::G03()
{
double AngStart,AngFinish,AngIterate,XIterate,YIterate,ZIterate;
double XOffset,YOffset,ZOffset,Radius,TotalAngle,DeltaAngle;
XOffset = XCurrent - m_ILocVar; // find start Angle
YOffset = YCurrent - m_JLocVar;
ZOffset = ZCurrent - m_ZLocVar;
Radius = sqrt( pow(XOffset,2) + pow(YOffset,2) );
AngStart = atan2( XOffset , YOffset ); // this should work for all quadrants;
XOffset = m_XLocVar - m_ILocVar; // and end angle;
YOffset = m_YLocVar - m_JLocVar;
ZOffset = m_ZLocVar - ZCurrent;
AngFinish = atan2( XOffset, YOffset );
if( AngFinish <= AngStart ) AngFinish += 6.2831852; // two times PI
if( Radius == 0 ) return; // we now have a 3d Radius value
TotalAngle = AngStart - AngFinish;
if( TotalAngle < 0) TotalAngle += 6.2831852;
if( TotalAngle == 0) TotalAngle = 6.2831852;
DeltaAngle = TotalAngle / ((6.2831852 * Radius * ( TotalAngle / 6.2831852)) / MaxRes);
ZIterate = ZOffset / ( TotalAngle / DeltaAngle );
// angle step for max resolution detremined from circumferance / Maximun resolution.
AngIterate = AngStart; XIterate = XCurrent; YIterate = YCurrent;
double ZHold = 0;
double ZHolder = ZCurrent;
while( AngIterate < ( AngFinish - DeltaAngle))
{
YIterate = (Radius * cos( AngIterate)) + m_JLocVar; // new x
XIterate = (Radius * sin( AngIterate)) + m_ILocVar; // new Y
double dist = XIterate - XCurrent;
double dist1 = YIterate - YCurrent;
if( dist < 0) dist = -dist;
if( dist1 < 0) dist1 = -dist1;
ZHold += ZIterate;
if( dist >= MaxRes || dist1 >= MaxRes)
GoToPos( XIterate, YIterate, ZHolder + ZHold); // go there
AngIterate += DeltaAngle; // next angle
}
GoToPos( m_XLocVar, m_YLocVar, m_ZLocVar );
}
void CMasterControlDlg::G032()
{
double AngStart,AngFinish,AngIterate,XIterate,YIterate,ZIterate;
double XOffset,YOffset,ZOffset,Radius,TotalAngle,DeltaAngle;
XOffset = XCurrent - m_X
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -