?? mastercontroldlg.cpp
字號:
}
void CMasterControlDlg::DoPulse()
{
double delay = 0;
double delay1 = 0;
if( ! (XPulse || ZPulse || YPulse) ) return;
if( Simulate ) return; // go away if simulating
if( Spindle ) cOutData = SpindleMask; // port data to zero
else
cOutData = 0;
if(IO48)
{
_outp( DA , IO48data & 0xff );
_outp( DB , (IO48data >> 8) & 0xff ); // for large table
_outp( DC , (IO48data >> 16) & 0xff );
}
delay = 0;
if( XPulse ) delay = XOverLap;
if( YPulse ) delay = __max( YOverLap , delay );
if( ZPulse ) delay = __max( ZOverLap , delay ); // get overlap delay
if( XDir ) cOutData |= XDirMask;
if( YDir ) cOutData |= YDirMask; // for printer port direction pulses
if( ZDir ) cOutData |= ZDirMask;
// step one....send dir pulse
int retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
&cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);
Delay( delay ); // Delay for overlap time with dir on.
if( IO48 && ZPulse )
{
IO48data &= 0x7fffff;
_outp( DC , (IO48data >> 16) & 0xff ); // set z-clock pulse ...negative for drive
}
delay1 = 0;
if( XPulse) delay1 = XWidth;
if( YPulse ) delay1 = __max( YWidth , delay1 );
if( ZPulse ) delay1 = __max( ZWidth , delay1 );
if( XPulse ) cOutData |= XStepMask;
if( YPulse ) cOutData |= YStepMask; // for printer port clock pulses
if( ZPulse ) cOutData |= ZStepMask;
retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
&cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);
Delay( delay1 ); // Delay for Width time
if( IO48 && ZPulse )
{
IO48data |= 0x800000;
_outp( DC, (IO48data >> 16) & 0xff ); // clear z clock ... positive for clear
}
if( XPulse ) cOutData &= (XStepMask ^ 0xff );
if( YPulse ) cOutData &= (YStepMask ^ 0xff ); // turn off the clock pulse
if( ZPulse ) cOutData &= (ZStepMask ^ 0xff );
retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
&cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);
Delay( delay ); // Delay for overlap again;
if( IO48 )
IO48data |= 0x400000; //set z-direction bit;
if( XPulse ) cOutData &= (XDirMask ^ 0xff);
if( YPulse ) cOutData &= (YDirMask ^ 0xff ); // turn off the dir pulse
if( ZPulse ) cOutData &= (ZDirMask ^ 0xff );
retval=DeviceIoControl(hDevice, PORTIO_SEND_BYTE_TO_PINS2_TO_9,
&cOutData, sizeof(cOutData), NULL, 0, &hold, NULL);
XPulse = false; YPulse = false; ZPulse = false; // clear the semaphores
YDir = false; XDir = false; ZDir = false; // for movement
LimitsIn();
if( EStop ) Emergency();
}
void CMasterControlDlg::Delay(double delay)
{
static first = 0;
LARGE_INTEGER since,now;
double sofar = 0;
QueryPerformanceCounter( &since );
while( sofar < delay)
{
QueryPerformanceCounter( &now );
__int64 temp = (now.QuadPart - since.QuadPart);
sofar = ((double)temp) / frequency.QuadPart;
}
if( first==0 ) { started = sofar; first = 1; }
rightnow = sofar;
}
void CMasterControlDlg::GoToPos(double newx, double newy, double newz)
{
if( !Enable ) return;
cOutData = 0;
int sArray;
long int nx,ny,nz;
nx = (long int) (newx / (double)XRes);
ny = (long int) (newy / (double)YRes);
nz = (long int) (newz / (double)ZRes);
int xinc = abs( XDigPos - (UINT)nx);
int yinc = abs( YDigPos - (UINT)ny);
int zinc = abs( ZDigPos - (UINT)nz);
sArray = __max( xinc,yinc );
sArray = __max( sArray, zinc );
if( Movements ) { delete[] Movements; Movements = NULL; }
if( sArray != 0) Movements = (unsigned char*) new char[sArray];
int index = 0;
Moves = sArray;
double xcount = 0, ycount = 0, zcount = 0;
while( nx != XDigPos || ny != YDigPos || nz != ZDigPos)
{
Movements[index] = 0;
xcount += xinc;
ycount += yinc;
zcount += zinc;
if( nz != ZDigPos )
{
if( zcount >= max( xinc,yinc))
{
if ( nz < ZDigPos ) { ZDigPos --; Movements[index] |= 0x44; } // z-step and dir = false
else { ZDigPos ++; Movements[index] |= 0x04; } // just z-step for true
zcount -= max( xinc,yinc );
}
}
if( ny != YDigPos )
{
if( ycount >= max(xinc,zinc) )
{
if ( ny < YDigPos) { YDigPos--; Movements[index] |= 0x22; }
else { YDigPos++; Movements[index] |= 0x02; }
ycount -= max( xinc,zinc );
}
}
if( nx != XDigPos )
{
if( xcount >= max(yinc,zinc) )
{
if (nx < XDigPos) { XDigPos--; Movements[index] |= 0x11; }
else { XDigPos++; Movements[index] |= 0x01; }
xcount -= max( yinc,zinc );
}
}
index++;
}
CalcRamp();
BurstOut();
// set new current location;
XCurrent = (double)XDigPos * XRes;
YCurrent = (double)YDigPos * YRes;
ZCurrent = (double)ZDigPos * ZRes;
if(XCurrent == 0 ) m_LEDXHome.Depress( true ); else m_LEDXHome.Depress( false );
if(YCurrent == 0 ) m_LEDYHome.Depress( true ); else m_LEDYHome.Depress( false );
if(ZCurrent == 0 ) m_LEDZHome.Depress( true ); else m_LEDZHome.Depress( false );
if( DispOn ) DrawTo();
}
void CMasterControlDlg::OnXplus()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData(TRUE);
GoToPos( XCurrent + m_JogDist, YCurrent, ZCurrent);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnXminus()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData(TRUE);
GoToPos( XCurrent - m_JogDist, YCurrent, ZCurrent);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnYminus()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData(TRUE);
GoToPos( XCurrent , YCurrent - m_JogDist, ZCurrent);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnYplus()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData(TRUE);
GoToPos( XCurrent , YCurrent + m_JogDist, ZCurrent);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnUp()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData(TRUE);
GoToPos( XCurrent , YCurrent, ZCurrent+ m_JogDist);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnDown()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData(TRUE);
GoToPos( XCurrent , YCurrent, ZCurrent- m_JogDist);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::CalcRamp()
{
double cXIncAcc,cYIncAcc,cZIncAcc;
double cXIncDec,cYIncDec,cZIncDec;
if( GMode != 0 )
{ cXIncAcc = XIncAccCut;
cXIncDec = XIncDecCut;
cYIncAcc = YIncAccCut;
cYIncDec = YIncDecCut;
cZIncAcc = ZIncAccCut;
cZIncDec = ZIncDecCut;
}
else
{
cXIncAcc = XIncAcc;
cXIncDec = XIncDec;
cYIncAcc = YIncAcc;
cYIncDec = YIncDec;
cZIncAcc = ZIncAcc;
cZIncDec = ZIncDec;
}
int x;
double hold;
if( Times ) {delete[] Times; Times = NULL; }
if( Moves == 0) return;
Times = (double*) new double[Moves];
for( x=0; x< Moves; x++)
{
hold = 0;
if( Movements[x] & 0x01 ) hold = XMaxDelay;
if( Movements[x] & 0x02 ) hold = __max( hold, YMaxDelay );
if( Movements[x] & 0x04 ) hold = __max( hold, ZMaxDelay );
Times[ x ] = hold;
}
for( x= 0; x < Moves; x++)
{
int y = x;
double temp = Times[ x];
while( Times[x++] == temp) if( x == Moves) break;
int len = (x-1) - y;
int ramp = 0;
if( temp == XMaxDelay && XRamp )
{
if( len < 10) break;
int front = 0;
int back = 0;
if ( (len/2) > (int)(XAcc * XPpi)) front = (int)(XAcc*XPpi); else front = len/2;
if ( (len/2) > (int)(XDec * XPpi)) back = (int)(XDec*XPpi); else back = len/2;
double holder = temp;
for( int z = 0; z < len; z++)
{
if( z < front) holder -= cXIncAcc;
if( z > len - back ) holder += cXIncDec;
Times[ y + z ] = holder;
}
}
if( temp == YMaxDelay && YRamp ) // no ramp for autoZSlow
{
if( len < 10) break;
int front = 0;
int back = 0;
if ( (len/2) > (int)(YAcc * YPpi)) front = (int)(YAcc*YPpi); else front = len/2;
if ( (len/2) > (int)(YDec * YPpi)) back = (int)(YDec*YPpi); else back = len/2;
double holder = temp;
for( int z = 0; z < len; z++)
{
if( z < front) holder -= cYIncAcc;
if( z > len - back ) holder += cYIncDec;
Times[ y + z ] = holder;
}
}
if( temp == ZMaxDelay && ZRamp )
{
if( len < 10) break;
int front = 0;
int back = 0;
if ( (len/2) > (int)(ZAcc * ZPpi)) front = (int)(ZAcc*ZPpi); else front = len/2;
if ( (len/2) > (int)(ZDec * ZPpi)) back = (int)(ZDec*ZPpi); else back = len/2;
double holder = temp;
for( int z = 0; z < len; z++)
{
if( z < front) holder -= cZIncAcc;
if( z > len - back ) holder += cZIncDec;
Times[ y + z ] = holder;
}
}
}
}
void CMasterControlDlg::OnGo()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GMode = 1;
UpdateData( true );
GoToPos( m_XGotoVar, m_YGotoVar, m_ZGotoVar);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
BOOL CMasterControlDlg::DestroyWindow()
{
if(Movements) delete[] Movements;
if(Times) delete[] Times;
return CDialog::DestroyWindow();
}
void CMasterControlDlg::BurstOut()
{
int x;
unsigned char now;
for( x = 0; x < Moves; x++)
{
now = Movements[x];
if( now & 0x01 ) { if( now & 0x10 ) PulseX( true ); else PulseX( false ); }
if( now & 0x02 ) { if( now & 0x20 ) PulseY( true ); else PulseY( false ); }
if( now & 0x04 ) { if( now & 0x40 ) PulseZ( false ); else PulseZ( true ); }
DoPulse();
if( !Simulate )Delay( Times[ x ] );
TimeEstimate += Times[ x ]+latency;
if( !Enable) break;
}
}
void CMasterControlDlg::OnHomeall()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GoToPos(0,0,0);
m_XLocVar = XCurrent;
m_YLocVar = YCurrent;
m_ZLocVar = ZCurrent;
UpdateData(false);
}
void CMasterControlDlg::OnHomex()
{
if( ! Enable )
{
MessageBox( " --- Emergency Stop ---- " );
return;
}
GoToPos( 0, YCurrent, ZCurrent );
m_XLocVar = XCurrent;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -