Files
EF3-Interface/PcDmis/Base/Interfac/Msi/Hsi/MicroVu/Mv_Proto.cpp
T
2013-05-09 20:29:54 +08:00

3295 lines
124 KiB
C++

//=============================================================================
#include "stdafx.h"
#include "Mv_Proto.h"
#include "SsiStatus.h"
#include "Logger.h"
#include "math.h"
#define MY_CONFIG 1
#define MAX_DEVPATH_LENGTH 256
#define ENDPOINT_TIMEOUT 500
//***** Static Data *****
struct_ep_buff CMv_Proto::ep_buff[lEPSIZE];
//================================================================
int CMv_Proto::g_hEP81_Thread_State=THREAD_PAUSED;
HANDLE CMv_Proto::g_hEP81_Thread_Id=NULL;
//================================================================
int CMv_Proto::g_hEP82_Thread_State=THREAD_PAUSED;
HANDLE CMv_Proto::g_hEP82_Thread_Id=NULL;
//================================================================
int CMv_Proto::g_hEP01_Thread_State=THREAD_PAUSED;
HANDLE CMv_Proto::g_hEP01_Thread_Id=NULL;
HANDLE CMv_Proto::g_hEP01_Serial_Mutex;
//================================================================
int CMv_Proto::g_hEP02_Thread_State=THREAD_PAUSED;
HANDLE CMv_Proto::g_hEP02_Thread_Id=NULL;
HANDLE CMv_Proto::g_hEP02_Serial_Mutex;
//================================================================
struct_machine CMv_Proto::g_machine;
usb_dev_handle *CMv_Proto::g_dev=NULL;
CLogger *CMv_Proto::g_pLogger;
HANDLE CMv_Proto::g_hHomedEvent = NULL;
//===========================================================================
// Worker Thread to serialize EP_01 commands.
//===========================================================================
unsigned __stdcall CMv_Proto::g_EP01_Thread(LPVOID pThis)
{
CMv_Proto* _This = (CMv_Proto*)pThis;
for (;;)
{
TRACE0("g_hSerialUsbThread in loop set.\n");
if (g_hEP01_Thread_State == THREAD_EXIT)
ExitThread(0);
WaitForSingleObject(ep_buff[EP_01_CMD_IDX]._event,INFINITE);
TRACE0("g_hSerialUsbThread obtained event.\n");
switch (g_hEP01_Thread_State)
{
case THREAD_EXIT:
{
ExitThread(0);
}
case THREAD_PAUSED:
break;
case THREAD_RUNNING:
{
TRACE0("g_hSerialUsbThread processing _send_usb_data();\n");
_This->_send_usb_data(EP_01_CMD_IDX);
TRACE0("g_hSerialUsbThread return from _send_usb_data();\n");
break;
}
default:
ExitThread(0);
}
};
g_hEP01_Thread_State = THREAD_EXIT;
ExitThread(0);
};
//============================================== =============================
// Worker Thread to serialize EP_02 commands.
//===========================================================================
unsigned __stdcall CMv_Proto::g_EP02_Thread(LPVOID pThis)
{
CMv_Proto* _This = (CMv_Proto*)pThis;
for (;;)
{
TRACE0("g_hEP02_Thread in loop set.\n");
if (g_hEP02_Thread_State == THREAD_EXIT)
ExitThread(0);
WaitForSingleObject(ep_buff[EP_02_CMD_IDX]._event,INFINITE);
TRACE0("g_hEP02_Thread obtained event.\n");
switch (g_hEP02_Thread_State)
{
case THREAD_EXIT:
{
ExitThread(0);
}
case THREAD_PAUSED:
break;
case THREAD_RUNNING:
{
TRACE0("g_hEP02_Thread calling _send_usb_data. EP_02; %x\n");
_This->_send_usb_data(EP_02_CMD_IDX);
TRACE0("g_hEP02_Thread return _send_usb_data. EP_02; %x\n");
break;
}
default:
ExitThread(0);
}
};
g_hEP02_Thread_State = THREAD_EXIT;
ExitThread(0);
};
//******************************************************************************
// This is the worker thread to process USBD_TRANSFER_DIRECTION_IN
//******************************************************************************
unsigned __stdcall CMv_Proto::g_EP81_Thread(LPVOID pThis)
{
CMv_Proto* _This = (CMv_Proto*)pThis;
for (;;)
{
WaitForSingleObject(ep_buff[EP_81_DATA_IDX]._event, INFINITE);
switch (g_hEP81_Thread_State)
{
case THREAD_EXIT:
{
ExitThread(0);
}
case THREAD_PAUSED:
break;
case THREAD_RUNNING:
{
_This->_reap_async_8x(EP_81_DATA_IDX);
break;
}
default:
ExitThread(0);
}
}
}
//******************************************************************************
// This is the worker thread to process USBD_TRANSFER_DIRECTION_IN
//******************************************************************************
unsigned __stdcall CMv_Proto::g_EP82_Thread(LPVOID pThis)
{
CMv_Proto* _This = (CMv_Proto*)pThis;
for (;;)
{
WaitForSingleObject(ep_buff[EP_82_DATA_IDX]._event, INFINITE);
switch (g_hEP82_Thread_State)
{
case THREAD_EXIT:
{
ExitThread(0);
}
case THREAD_PAUSED:
break;
case THREAD_RUNNING:
{
_This->_reap_async_8x(EP_82_DATA_IDX);
break;
}
default:
ExitThread(0);
}
}
}
//===========================================================================
double CMv_Proto::ScaleToMM(long lCount, double dResolution)
{
double dMM = 0.0;
dMM = lCount * dResolution;
return dMM;
}
//===========================================================================
long CMv_Proto::MMtoScale(double lDistanceMM, double dResolution)
{
long lCounts = 0;
if (dResolution)
lCounts = (long) (lDistanceMM / dResolution);
else
ASSERT(0);
return lCounts;
}
//===========================================================================
void CMv_Proto::Trace_EP_Buff(long lIndex)
{
UCHAR tmp[256];
CString csTmp;
memcpy(tmp, ep_buff[lIndex]._buffer, ep_buff[lIndex]._size);
csTmp = _T("Trace_EP_Buff _59 ");
for (int ii= 0 ; ii < ep_buff[lIndex]._size ; ++ii)
{
CString csTmpHex;
csTmpHex.Format(_T("%2X"), tmp[ii] );
csTmp += csTmpHex;
}
TRACE1("_process_MV_CMD_GET_INDEX_4E() Trace_EP_Buff %s \n", csTmp);
}
//=====================================================================================
long CMv_Proto::_4char2long(unsigned char *cBuff)
{
union
{
long l_value;
char c_array[5];
};
memset (c_array, 0, 5);
c_array[0] = cBuff[3];
c_array[1] = cBuff[2];
c_array[2] = cBuff[1];
c_array[3] = cBuff[0];
return(l_value);
}
//========================================================================
void CMv_Proto::_reverse_dword(DWORD *dWord)
{
BYTE cBuff[4];
BYTE *dwBuff = (BYTE *)dWord;
for ( int ii = 0 ; ii < 4 ; ++ii )
cBuff[ii]= dwBuff[ii];
dwBuff[0] = cBuff[3];
dwBuff[1] = cBuff[2];
dwBuff[2] = cBuff[1];
dwBuff[3] = cBuff[0];
}
//========================================================================
void CMv_Proto::mv_set_full_ringlight_data(long lIntensity)
{
if (g_machine.s_machine_config._vector_light_model == 3)
{
for (int ii=0 ; ii<FIVE_RINGS; ii++ )
{
for (int jj=0 ; jj<EIGHT_SEGS ; jj++)
{
g_machine.s_lights_300._segment[ii][jj] = lIntensity;
}
}
}
else
// if (m_pMv_Proto->g_machine.s_machine_config._vector_light_model == 2)
{
for (int ii=0 ; ii<TWO_RINGS; ii++ )
{
for (int jj=0 ; jj<EIGHT_SEGS ; jj++)
{
g_machine.s_lights_200._segment[ii][jj] = lIntensity;
}
}
};
}
//******************************************************************************
void CMv_Proto::mv_set_ringlight_data(long lMaxSize, double *pSegments)
{
if (pSegments)
{
if (g_machine.s_machine_config._vector_light_model == 3)
{
for (int ii=0 ; ii<FIVE_RINGS; ii++ )
{
for (int jj=0 ; jj<EIGHT_SEGS ; jj++)
{
if ((ii+1) * (jj+1) < lMaxSize)
g_machine.s_lights_300._segment[ii][jj] = (long)((pSegments[ii * EIGHT_SEGS + jj])/100.0 * (mvMAXLIGHTVALUE-1));
}
}
}
else
// if (g_machine.s_machine_config._vector_light_model == 2)
{
for (int ii=0 ; ii<TWO_RINGS; ii++ )
{
for (int jj=0 ; jj<EIGHT_SEGS ; jj++)
{
if ((ii+1) * (jj+1) < lMaxSize)
g_machine.s_lights_200._segment[ii][jj] = (long)((pSegments[ii * EIGHT_SEGS + jj])/100.0 * (mvMAXLIGHTVALUE-1));
}
}
}
}
}
//******************************************************************************
// Parse the data received based on the index (which EP are we processing).
// The CCmdObj should only have one CMD_STATUS_PROCESSING.
// Update CCmdObj _ep_01_status and _ep_81_status.
// Update _status to CMD_STATUS_COMPLETE when both _ep_01_status and _ep_81_status
// are CMD_STATUS_COMPLETE.
//
//******************************************************************************
void CMv_Proto::_process_rcv_transfer_data(int iEP)
{
static long lRcvCnt = 0;
static long lRcvCnt2 = 0;
switch (iEP)
{
case EP_01_CMD_IDX :
TRACE0("_process_rcv_transfer_data() : Update EP_01_CMD_IDX.\r\n");
++lRcvCnt;
break;
case EP_81_DATA_IDX : //
++lRcvCnt;
switch (ep_buff[EP_01_CMD_IDX]._save_send_cmd)
{
case MV_CMD_GET_SUB_CONFIG_28:
_process_MV_CMD_GET_SUB_CONFIG_28();
break;
case MV_CMD_SERVO_CMD_2B:
_process_MV_CMD_SERVO_CMD_2B();
break;
case MV_CMD_GET_X_INDEX_41:
_process_MV_CMD_GET_X_INDEX_41();
break;
case MV_CMD_GET_Y_INDEX_42:
_process_MV_CMD_GET_Y_INDEX_42();
break;
case MV_CMD_GET_MAG_43:
_process_MV_CMD_GET_MAG_43();
break;
case MV_CMD_GET_ZOOM_DECEL_45:
_process_MV_CMD_GET_ZOOM_DECEL_45();
break;
case MV_CMD_GET_INDEX_4E:
_process_MV_CMD_GET_INDEX_4E();
break;
case MV_CMD_MAX_ACCEL_51:
_process_MV_CMD_MAX_ACCEL_51();
break;
case MV_CMD_MAX_SPEED_50:
_process_MV_CMD_MAX_SPEED_50();
break;
case MV_CMD_GET_SCALE_58:
_process_MV_CMD_GET_SCALE_58();
break;
case MV_CMD_GET_POLL_59:
_process_MV_CMD_GET_POLL_59();
break;
case MV_CMD_GET_CONFIG_60:
_process_MV_CMD_GET_CONFIG_60();
break;
case MV_CMD_GET_CONFIG_69:
_process_MV_CMD_GET_CONFIG_69();
break;
case MV_CMD_SET_LIGHT_6E:
_process_MV_CMD_SET_LIGHT_6E();
if (ep_buff[EP_81_DATA_IDX]._buffer[0] != 0x6E)
{
ASSERT(0);
};
break;
case MV_CMD_GET_LIGHT_CONFIG_70:
_process_MV_CMD_GET_LIGHT_CONFIG_70();
break;
case MV_CMD_MAX_DECEL_76:
_process_MV_CMD_MAX_DECEL_76();
break;
case MV_CMD_GET_SCALE_SLACK_7C:
_process_MV_CMD_GET_SCALE_SLACK_7C();
break;
case MV_CMD_GET_WORKING_LIMITS_5E:
_process_MV_CMD_GET_WORKING_LIMITS_5E();
break;
case 0x2C :
_process_MV_CMD_2C();
break;
default:
TRACE1("_process_rcv_transfer_data() : Unknown ep_buff[EP_01_CMD_IDX]._save_send_cmd : %X \r\n", ep_buff[EP_01_CMD_IDX]._save_send_cmd);
TRACE1("_process_rcv_transfer_data() : Unknown ep_buff[EP_81_DATA_IDX]._buffer[0] : %X \r\n", ep_buff[EP_81_DATA_IDX]._buffer[0]);
break;
};
TRACE0("_process_rcv_transfer_data() : Update EP_81_DATA_IDX status.\r\n");
break;
case EP_02_CMD_IDX :
TRACE0("_process_rcv_transfer_data() : Update EP_02_CMD_IDX.\r\n");
++lRcvCnt2;
break;
case EP_82_DATA_IDX :
// parse result and put into its proper place.
_process_MV_CMD_GET_FINE_SCALE();
++lRcvCnt2;
break;
default:
break;
};
lRcvCnt = (lRcvCnt == 2) ? 0:lRcvCnt;
lRcvCnt2 = (lRcvCnt2 == 2) ? 0:lRcvCnt2;
};
//******************************************************************************
void CMv_Proto::_scale2inch(unsigned long scale, double &inch)
{
UNREFERENCED_PARAMETER(scale);
UNREFERENCED_PARAMETER(inch);
}
//******************************************************************************
void CMv_Proto::_inch2scale(unsigned long &scale, double inch)
{
UNREFERENCED_PARAMETER(scale);
UNREFERENCED_PARAMETER(inch);
}
//******************************************************************************
// convert a string of characters into its binary form
void CMv_Proto::_char2bin(unsigned char *cBuff, BYTE *cBytes, int iLen)
{
memset(cBytes, 0, MAX_BUFF_SIZE);
for (int i=0;i<iLen;i++)
{
sscanf_s((const char *)(cBuff+i*2), "%2x", (cBytes+i));
};
return;
}
//******************************************************************************
void CMv_Proto::_swap_byte(unsigned short &Val)
{
unsigned short MSB = Val<<8;
BYTE LSB = Val>>8;
Val = MSB|LSB;
}
//******************************************************************************
double CMv_Proto::TimeInSecs(void)
{
double Secs;
LARGE_INTEGER HPCounterTicksPerSecond;
BOOL HasHPCounter = QueryPerformanceFrequency(&HPCounterTicksPerSecond);
if (HasHPCounter == TRUE)
{
// Use high resolution clock.
double HPCounterTicksPersec = (DWORD)((double) HPCounterTicksPerSecond.QuadPart);
LARGE_INTEGER HPTicks;
QueryPerformanceCounter(&HPTicks);
Secs = ((double)HPTicks.QuadPart / HPCounterTicksPersec);
}
else
{
// Use clock with less resolution.
Secs = GetTickCount();
Secs /= 1000.0;
}
return Secs;
}
//******************************************************************************
CMv_Proto::CMv_Proto()
{
ep_buff[EP_01_CMD_IDX]._ep = EP_01;
ep_buff[EP_81_DATA_IDX]._ep = EP_81;
ep_buff[EP_02_CMD_IDX]._ep = EP_02;
ep_buff[EP_82_DATA_IDX]._ep = EP_82;
for (int i=0;i<lEPSIZE;i++)
{
ep_buff[i]._size = 0;
ep_buff[i]._save_send_cmd = 99;
ep_buff[i]._async_context = NULL;
ep_buff[i]._buffer = (char *)malloc(MAX_BUFF_SIZE);
ep_buff[i]._hProtoPending = false;
ep_buff[i]._event = NULL;
};
g_machine.x._pos_58 = -7777;
g_machine.y._pos_58 = -8888;
g_machine.z._pos_58 = -9999;
g_machine.zm._pos_58 = -6666;
g_machine.x._pos_59 = 333;
g_machine.y._pos_59 = 444;
g_machine.z._pos_59 = 555;
g_machine.zm._pos_59 = 222;
g_machine.x._scale_pos = -1111;
g_machine.y._scale_pos = -2222;
g_machine.z._scale_pos = -3333;
g_machine.zm._scale_pos = -4444;
g_machine.s_machine_config.x_axis._scale_resolution = 0.001;
g_machine.s_machine_config.y_axis._scale_resolution = 0.001;
g_machine.s_machine_config.z_axis._scale_resolution = 0.001;
g_machine.s_machine_config.x_axis._max_speed = 50000;
g_machine.s_machine_config.y_axis._max_speed = 50000;
g_machine.s_machine_config.z_axis._max_speed = 50000;
g_machine.s_machine_config.zm_axis._max_speed = 5000;
g_machine.s_machine_config.x_axis._max_accel = 1000000;
g_machine.s_machine_config.x_axis._max_decel = 4000000;
g_machine.s_machine_config.y_axis._max_accel = 1000000;
g_machine.s_machine_config.y_axis._max_decel = 4000000;
g_machine.s_machine_config.z_axis._max_accel = 1000000;
g_machine.s_machine_config.z_axis._max_decel = 4000000;
g_machine.s_machine_config.zm_axis._slack = 299;
g_machine.s_machine_config._nbr_lamps = 3;
g_machine.s_status._bXYZZMIdle = false;
g_machine.s_machine_config._dXYZSpeed = 50;
m_bHomingActive = false;
g_pLogger = new CLogger();
};
//******************************************************************************
CMv_Proto::~CMv_Proto()
{
for (int i=0;i<lEPSIZE;i++)
{
free(ep_buff[i]._buffer);
};
delete g_pLogger;
g_pLogger = NULL;
}
#pragma warning(disable:4996)
//******************************************************************************
// Log file shows the machine configuration data
//
SSI_STATUS CMv_Proto::Load_MicroVu_Config()
{
FILE *hConfigFile = NULL;
char szLine[MAX_BUFF_SIZE];
char *token = NULL;
char seps[] = " =,\t\n";
CString csAppPath;
GetAppPath(csAppPath);
CString csMvConfigFile = csAppPath + _T("\\mv_config.cfg");
_wfopen_s(&hConfigFile, csMvConfigFile, _T("rt"));
if (hConfigFile)
{
while (!feof(hConfigFile))
{
fgets(szLine,MAX_BUFF_SIZE,hConfigFile); //read a line
if ((szLine[0] != ';') && (strlen(szLine) > 2))
{
token = strtok( szLine, seps ); // Get the command token
if (!_stricmp(token, "DEBUG")) // Hex Mask
{
token = strtok( NULL, seps);
if (token)
{
g_pLogger->m_lLogMask=atoi(token); // 0 or 1 to indicate ON/Off
}
}
else if (!_stricmp(token, "STR_2B01")) // STR_2B_01
{
token = strtok( NULL, seps);
if (token)
{
strcpy(g_machine.s_machine_config._str_2b, token);
_char2bin((unsigned char *)g_machine.s_machine_config._str_2b, g_machine.s_machine_config._str_bin_2b, (int) strlen(g_machine.s_machine_config._str_2b));
}
}
else if (!_stricmp(token, "STR_7000")) // STR_7000
{
token = strtok( NULL, seps);
if (token)
{
strcpy(g_machine.s_machine_config._str_7000_signature, token);
_char2bin((unsigned char *)g_machine.s_machine_config._str_7000_signature, g_machine.s_machine_config._str_bin_7000, (int) strlen(g_machine.s_machine_config._str_7000_signature));
}
}
else if (!_stricmp(token, "STR_6f00")) // STR_6f00
{
token = strtok( NULL, seps);
if (token)
{
strcpy(g_machine.s_machine_config._str_6f00_signature, token);
_char2bin((unsigned char *)g_machine.s_machine_config._str_6f00_signature, g_machine.s_machine_config._str_bin_6f00, (int) strlen(g_machine.s_machine_config._str_6f00_signature));
}
}
else if (!_stricmp(token, "USB_COMMAND_WAIT")) // Pause between Usb Receive Commands
{
token = strtok( NULL, seps);
if (token)
{
g_machine.s_machine_config._usb_command_wait=atoi(token); // 0 or 1 to indicate ON/Off
}
}
else if (!_stricmp(token, "USB_COMMAND_TIMEOUT")) // How long should we wait before we call it timeout
{
token = strtok( NULL, seps);
if (token)
{
g_machine.s_machine_config._usb_command_timeout=atoi(token); // 0 or 1 to indicate ON/Off
}
}
}
}
fclose(hConfigFile);
}
else
{
return SSI_STATUS_MV_CONFIG_FILE_NOT_FOUND;
};
return SSI_STATUS_NORMAL;
};
//******************************************************************************
usb_dev_handle* CMv_Proto::_open_usb_dev(void)
{
struct usb_bus *bus = NULL;
struct usb_device *dev = NULL;
for (bus = usb_get_busses(); bus; bus = bus->next)
{
for (dev = bus->devices; dev; dev = dev->next)
{
if (dev->descriptor.idVendor == MICROVU_VID && dev->descriptor.idProduct == MICROVU_PID)
{
return usb_open(dev);
}
}
}
return NULL;
}
//******************************************************************************
// Send is direct and async.
// The receive thread will receive data and interpret it.
//******************************************************************************
SSI_STATUS CMv_Proto::Init_MvUsb()
{
// Set initial state of the machine
g_machine.s_status._machine_running = false;
g_machine.s_status._poll_58_active = false;
g_machine.s_status._poll_59_active = false;
g_machine.s_status._poll_2b_active = false;
SSI_STATUS Status=SSI_STATUS_NORMAL;
UNREFERENCED_PARAMETER(Status);
if (g_pLogger->m_lLogMask & LOGACTIONS)
g_pLogger->SendAndFlushPerMode(_T("Enter Initialize Mv Usb\n"));
int usb_status = NULL;
usb_init(); // initialize the library
usb_status = usb_find_busses(); // find all busses
usb_status = usb_find_devices(); // find all connected devices
g_dev = _open_usb_dev();
if (!g_dev)
{
MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK);
g_pLogger->SendAndFlushPerMode(_T("Unable to open device %s"), usb_strerror());
return SSI_STATUS_DATALINK_ERROR;
}
if (usb_set_configuration(g_dev, MY_CONFIG) < 0)
{
MessageBox(NULL, _T("Unable to SET CONFIGURATION"), _T("Message"), MB_OK);
return SSI_STATUS_DATALINK_ERROR;
}
if (usb_claim_interface(g_dev, 0) < 0)
{
usb_close(g_dev);
MessageBox(NULL, _T("Unable to CLAIM DEVICE"), _T("Message"), MB_OK);
return SSI_STATUS_DATALINK_ERROR;
}
// ********************************************************************
// This event is used to kick the Serial Usb Command process. This threading model
// is important because the underlying library is not thread-safe.
//
ep_buff[EP_01_CMD_IDX]._event = CreateEvent(NULL, // default security attributes
FALSE, // manual reset event object
NULL, // signaled
NULL); // unamed object
g_hEP01_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) g_EP01_Thread,
(LPVOID) this,
0,
NULL);
g_hEP01_Thread_State = THREAD_RUNNING;
// ********************************************************************
// This event is used to kick the Serial Usb Command process. This threading model
// is important because the underlying library is not thread-safe.
//
ep_buff[EP_02_CMD_IDX]._event = CreateEvent(NULL, // default security attributes
FALSE, // manual reset event object
NULL, // signaled
NULL); // unamed object
g_hEP02_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) g_EP02_Thread,
(LPVOID) this,
0,
NULL);
g_hEP02_Thread_State = THREAD_RUNNING;
// ********************************************************************
// Prepare and start EP_81 Thread - Use async commit.
//
ep_buff[EP_81_DATA_IDX]._event = CreateEvent(NULL, // default security attributes
FALSE, // manual reset event object
NULL, // signaled
NULL); // unamed object
g_hEP81_Thread_State = THREAD_PAUSED;
g_hEP81_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) g_EP81_Thread,
(LPVOID) this,
0,
NULL);
g_hEP01_Serial_Mutex = CreateMutex(NULL, // default security attributes
FALSE, // initial owner
NULL); // name
// ********************************************************************
// Prepare and start EP_82 Thread - Use async commit.
//
ep_buff[EP_82_DATA_IDX]._event = CreateEvent(NULL, // default security attributes
FALSE, // manual reset event object
NULL, // signaled
NULL); // unamed object
g_hEP82_Thread_State = THREAD_PAUSED;
g_hEP82_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE) g_EP82_Thread,
(LPVOID) this,
0,
NULL);
g_hEP02_Serial_Mutex = CreateMutex(NULL, // default security attributes
FALSE, // initial owner
NULL); // name
// *********************************************************************
g_hHomedEvent = CreateEvent(NULL, // default security attributes
TRUE, // manual reset event object
FALSE, // initial state is signaled
NULL); // unamed object
if (g_pLogger->m_lLogMask & LOGACTIONS)
g_pLogger->SendAndFlushPerMode(_T("Exit Initialize Usb\n"));
return SSI_STATUS_NORMAL;
}
//******************************************************************************
SSI_STATUS CMv_Proto::Exit_MvUsb()
{
SSI_STATUS Status=SSI_STATUS_NORMAL;
if (g_pLogger->m_lLogMask & LOGACTIONS)
g_pLogger->SendAndFlushPerMode(_T("Enter Exit_MvUsb\n"));
g_hEP81_Thread_State = THREAD_EXIT;
g_hEP82_Thread_State = THREAD_EXIT;
g_hEP01_Thread_State = THREAD_EXIT;
g_hEP02_Thread_State = THREAD_EXIT;
SetEvent(ep_buff[EP_81_DATA_IDX]._event);
if (g_hEP81_Thread_Id)
{
DWORD dwCode = STILL_ACTIVE;
while (dwCode == STILL_ACTIVE)
{
GetExitCodeThread(g_hEP81_Thread_Id,&dwCode);
Sleep(1);
}
}
SetEvent(ep_buff[EP_82_DATA_IDX]._event);
if (g_hEP82_Thread_Id)
{
DWORD dwCode = STILL_ACTIVE;
while (dwCode == STILL_ACTIVE)
{
GetExitCodeThread(g_hEP82_Thread_Id,&dwCode);
Sleep(1);
}
}
SetEvent(ep_buff[EP_01_CMD_IDX]._event);
if (g_hEP01_Thread_Id)
{
DWORD dwCode = STILL_ACTIVE;
while (dwCode == STILL_ACTIVE)
{
GetExitCodeThread(g_hEP01_Thread_Id,&dwCode);
Sleep(1);
}
}
SetEvent(ep_buff[EP_02_CMD_IDX]._event);
if (g_hEP02_Thread_Id)
{
DWORD dwCode = STILL_ACTIVE;
while (dwCode == STILL_ACTIVE)
{
GetExitCodeThread(g_hEP02_Thread_Id,&dwCode);
Sleep(1);
}
}
if (g_dev)
{
usb_release_interface(g_dev,0);
usb_close(g_dev);
g_dev = NULL;
}
SetEvent(ep_buff[EP_81_DATA_IDX]._event);
CloseHandle(ep_buff[EP_81_DATA_IDX]._event);
SetEvent(ep_buff[EP_82_DATA_IDX]._event);
CloseHandle(ep_buff[EP_82_DATA_IDX]._event);
g_hEP01_Thread_State = THREAD_EXIT;
SetEvent(ep_buff[EP_01_CMD_IDX]._event);
CloseHandle(ep_buff[EP_01_CMD_IDX]._event);
g_hEP02_Thread_State = THREAD_EXIT;
SetEvent(ep_buff[EP_02_CMD_IDX]._event);
CloseHandle(ep_buff[EP_02_CMD_IDX]._event);
ReleaseMutex(g_hEP01_Serial_Mutex);
CloseHandle(g_hEP01_Serial_Mutex);
ReleaseMutex(g_hEP02_Serial_Mutex);
CloseHandle(g_hEP02_Serial_Mutex);
if (g_pLogger->m_lLogMask & LOGACTIONS)
g_pLogger->SendAndFlushPerMode(_T("Exit Exit_MvUsb\n"));
return Status;
}
//******************************************************************************
SSI_STATUS CMv_Proto::ExtractAppPath(CString &Path)
{
CString tmpPath = Path;
tmpPath.TrimRight();
tmpPath.TrimLeft();
int nLastSlash = tmpPath.ReverseFind('\\');
if (nLastSlash > -1)
{ // complete path
tmpPath = Path.Left(nLastSlash);
Path = tmpPath;
}
else
{ // not a complete path
Path="";
};
return SSI_STATUS_NORMAL;
};
//******************************************************************************
SSI_STATUS CMv_Proto::GetAppPath(CString &Path)
{
Path=_T(""); // Speed optimization - noticed slow in GlowCode
if (Path.IsEmpty())
{
CString tmpPath;
GetModuleFileName(NULL,tmpPath.GetBuffer(255),255);
tmpPath.ReleaseBuffer();
tmpPath.TrimRight();
int nLastSlash = tmpPath.ReverseFind('\\');
if (nLastSlash >= 0)
tmpPath = tmpPath.Left(nLastSlash);
else
tmpPath.Empty();
Path=tmpPath;
}
return SSI_STATUS_NORMAL;
};
//******************************************************************************
// Replay the capture file.
// There are three special commands:
// 7000
// 6f00
// 4c02
//******************************************************************************
SSI_STATUS CMv_Proto::_replay_capture(CString s_replay_file)
{
char *_0x4e00_cmd = "4e00";
FILE* pInFile;
_wfopen_s(&pInFile, s_replay_file, _T("r"));
if (pInFile == NULL)
return SSI_STATUS_REPLAY_FILE_ERROR;
char *cData = (char *)malloc(MAX_BUFF_SIZE);
char *inBuff = (char *)malloc(MAX_BUFF_SIZE);
fgets((char *)inBuff, MAX_BUFF_SIZE, pInFile ); // pick up the first line
while (!feof(pInFile))
{
if (*inBuff == '>')
{
if (strstr(inBuff, "0x00000001"))
{
if (!(_strnicmp(inBuff+35, _0x4e00_cmd, 4))) break;
_process_replay_capture_commands(inBuff, pInFile);
}
};
fgets((char *)inBuff, MAX_BUFF_SIZE, pInFile ); // pick up the first line
};
fclose(pInFile);
free(cData);
free(inBuff);
return SSI_STATUS_NORMAL;
}
//******************************************************************************
// Do not send out DCC Home. We can send everything else.
//******************************************************************************
SSI_STATUS CMv_Proto::_process_replay_capture_commands(char *inBuff, FILE* pInFile)
{
char x[3];
char cSize[9];
int iSendSize;
int iRcvSize;
if ( ((*(inBuff+35) == '4')) && (*(inBuff+36) == 'f'))
{
fgets((char *)inBuff, MAX_BUFF_SIZE, pInFile ); // pick up the first line
return SSI_STATUS_NORMAL;
};
memset(cSize, 0 , 9);
memcpy(cSize, inBuff+24, 8);
sscanf_s(cSize, "%8x", &iSendSize); // get the length of the transmission
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0, MAX_BUFF_SIZE);
for (int j=0;j<iSendSize;j++)
{
memset(x, 0, 3);
memcpy(x, inBuff+35+(j*2), 2);
sscanf_s(x, "%2x", ep_buff[EP_01_CMD_IDX]._buffer+j);
};
ep_buff[EP_01_CMD_IDX]._size = iSendSize;
fgets((char *)inBuff, MAX_BUFF_SIZE, pInFile ); // pick up the first line
if (feof(pInFile)) SSI_STATUS_NORMAL; // if error, exit
memset(cSize, 0 , 9);
memcpy(cSize, inBuff+24, 8);
sscanf_s(cSize, "%8x", &iRcvSize); // get the length of the transmission
ep_buff[EP_81_DATA_IDX]._size = iRcvSize;
#pragma message("no usb comm??")
// _do_single_threaded_usb_comm(EP_01_CMD_IDX);
return SSI_STATUS_NORMAL;
};
//******************************************************************************
// Kick the g_hEP01_Thread_Event to get the g_EP01_Thread going.
// iEP = EP_01 or EP_02 = 0x01 or 0x02
//******************************************************************************
SSI_STATUS CMv_Proto::_do_single_threaded_usb_comm(int iEP_Base)
{
TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hEP01_Thread_Event. %x\n", iEP_Base);
while ((ep_buff[iEP_Base]._hProtoPending == TRUE) || (ep_buff[iEP_Base+1]._hProtoPending == TRUE))
{
ASSERT(0);
Sleep(3);
}
ep_buff[iEP_Base]._hProtoPending = ep_buff[iEP_Base+1]._hProtoPending = TRUE;
TRACE1("=====_do_single_threaded_usb_comm(iEP_Base) SetEvent(g_hEP01_Thread_Event): %X \r\n", ep_buff[iEP_Base]._save_send_cmd);
SetEvent(ep_buff[iEP_Base]._event);
while ((ep_buff[iEP_Base]._hProtoPending == TRUE) || (ep_buff[iEP_Base+1]._hProtoPending == TRUE))
{
Sleep(3);
}
TRACE1("=====_do_single_threaded_usb_comm(iEP) g_hProtoDoneEvents. %x\n", iEP_Base);
return SSI_STATUS_NORMAL;
}
//******************************************************************************
// This startup just kicks off the EP_81 worker thread.
//******************************************************************************
SSI_STATUS CMv_Proto::_start_machine()
{
g_hEP81_Thread_State = THREAD_RUNNING;
g_hEP82_Thread_State = THREAD_RUNNING;
g_machine.s_status._machine_running = true;
return SSI_STATUS_NORMAL;
};
//===============================================================================
SSI_STATUS CMv_Proto::_shutdown_machine()
{
g_machine.s_status._poll_58_active = false;
g_machine.s_status._poll_59_active = false;
g_machine.s_status._machine_running = false;
return SSI_STATUS_NORMAL;
};
//===============================================================================
// iEP = EP_01 or EP_02
//===============================================================================
SSI_STATUS CMv_Proto::_submit_async_8x(int iEP_Base)
{
int _ret;
_ret = usb_bulk_setup_async(g_dev, &(ep_buff[iEP_Base]._async_context), (unsigned char)ep_buff[iEP_Base]._ep);
if (_ret < 0)
{
return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR;
}
_ret = usb_submit_async(ep_buff[iEP_Base]._async_context, ep_buff[iEP_Base]._buffer, ep_buff[iEP_Base]._size);
if (_ret < 0)
{
printf("error usb_submit_async_ep_xx:\n%s\n", usb_strerror());
return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR;
}
return SSI_STATUS_NORMAL;
}
//===============================================================================
// iEP_Base : EP_81_DATA_IDX/EP_82_DATA_IDX
//
//===============================================================================
SSI_STATUS CMv_Proto::_reap_async_8x(int iEP_Base)
{
int _ret;
_ret = usb_reap_async(ep_buff[iEP_Base]._async_context, 50000);
if (_ret > 0)
{
_process_rcv_transfer_data(iEP_Base);
usb_free_async(&(ep_buff[iEP_Base]._async_context));
ep_buff[iEP_Base]._hProtoPending = false;
}
else
{
usb_free_async(&(ep_buff[iEP_Base]._async_context));
ASSERT(0);
return SSI_STATUS_MV_COMMAND_TIMEOUT;
}
return SSI_STATUS_NORMAL;
}
//===============================================================================
// _send_usb_data(iEP) sends data to the corresponding iEP channel.
// iEP = EP_01 / EP_02 EP_01 = 0x01; EP_02 = 0x02;
//===============================================================================
SSI_STATUS CMv_Proto::_send_usb_data(int iEP_Base)
{
int _ret;
ep_buff[iEP_Base]._save_send_cmd = ep_buff[iEP_Base]._buffer[0];
ep_buff[iEP_Base]._save_send_cmd0 = ep_buff[iEP_Base]._buffer[1];
ep_buff[iEP_Base]._save_send_cmd1 = ep_buff[iEP_Base]._buffer[2];
TRACE3("_send_usb_data() iEP : %X - ep_buff[iEP]._save_send_cmd : %X ._buffer[0] : %X\r\n", iEP_Base, ep_buff[EP_01_CMD_IDX]._save_send_cmd, ep_buff[EP_81_DATA_IDX]._buffer[0]);
_ret = usb_bulk_setup_async(g_dev, &(ep_buff[iEP_Base]._async_context), (unsigned char)ep_buff[iEP_Base]._ep);
if (_ret < 0)
{
return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR;
}
_ret = usb_submit_async(ep_buff[iEP_Base]._async_context, ep_buff[iEP_Base]._buffer, ep_buff[iEP_Base]._size);
if (_ret < 0)
{
printf("error usb_submit_async_ep_xx:\n%s\n", usb_strerror());
return SSI_STATUS_SETUP_ASYNC_CONTEXT_ERROR;
}
TRACE1("_submit_async_8x(EP:%X)\r\n", iEP_Base);
//
ep_buff[iEP_Base+1]._save_send_cmd = ep_buff[iEP_Base+1]._buffer[0];
ep_buff[iEP_Base+1]._save_send_cmd0 = ep_buff[iEP_Base+1]._buffer[1];
ep_buff[iEP_Base+1]._save_send_cmd1 = ep_buff[iEP_Base+1]._buffer[2];
//
_submit_async_8x(iEP_Base+1); // Send EP_81/EP_82
// Get ready to receive on EP_81 or EP_82
SetEvent(ep_buff[iEP_Base+1]._event);
// Get ready to receive on EP_01 or EP_02
_ret = usb_reap_async(ep_buff[iEP_Base]._async_context, 10000);
if (_ret > 0)
{
_process_rcv_transfer_data(iEP_Base);
usb_free_async(&(ep_buff[iEP_Base]._async_context));
ep_buff[iEP_Base]._hProtoPending = false;
}
else
{
usb_free_async(&(ep_buff[iEP_Base]._async_context));
ASSERT(0);
return SSI_STATUS_MV_COMMAND_TIMEOUT;
}
return SSI_STATUS_NORMAL;
}
//========================================================================
// Poll Machine 58
//========================================================================
SSI_STATUS CMv_Proto::_poll_machine_58()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
*(ep_buff[EP_01_CMD_IDX]._buffer) = MV_CMD_GET_SCALE_58;
ep_buff[EP_01_CMD_IDX]._size = 0x01; // send 0x01 bytes over
ep_buff[EP_81_DATA_IDX]._size = 0x11; // expects 45 bytes back
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//========================================================================
// Poll Machine
// submit poll command, update the position readout
//========================================================================
SSI_STATUS CMv_Proto::_poll_machine_59()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
*(ep_buff[EP_01_CMD_IDX]._buffer) = MV_CMD_GET_POLL_59;
*(ep_buff[EP_01_CMD_IDX]._buffer+1) = 0x01;
*(ep_buff[EP_01_CMD_IDX]._buffer+2) = 0x01;
ep_buff[EP_01_CMD_IDX]._size = 0x10; // send 0x01 bytes over
ep_buff[EP_81_DATA_IDX]._size = 0x3e; // expects 45 bytes back
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//========================================================================
// _poll_machine_2b
//========================================================================
SSI_STATUS CMv_Proto::_poll_machine_2b()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
*ep_buff[EP_01_CMD_IDX]._buffer = MV_CMD_SERVO_CMD_2B;
ep_buff[EP_01_CMD_IDX]._size = 0x01; // send 0x01 bytes over
ep_buff[EP_81_DATA_IDX]._size = 0x45; // expects 45 bytes back
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_is_supported()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// call from Hsi
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_startup(double dScaleResolutionX, double dScaleResolutionY, double dScaleResolutionZ)
{
g_machine.s_machine_config.x_axis._scale_resolution = dScaleResolutionX;
g_machine.s_machine_config.y_axis._scale_resolution = dScaleResolutionY;
g_machine.s_machine_config.z_axis._scale_resolution = dScaleResolutionZ;
_start_machine();
mv_motion_Dcc_Home();
_replay_capture(_T("Replay_Capture"));
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_axis_count(int &iCount)
{
iCount = 4;
return SSI_STATUS_NORMAL;
}
//========================================================================
// This speed setting will be carried out in the next DCC move
// Full Speed -> dPercentSpeed = 100%
// Slow Speed -> dPercentSpeed = 20%
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_set_speed_xyz(double dPercentSpeed)
{
g_machine.s_machine_config._dXYZSpeed = dPercentSpeed;
return SSI_STATUS_NORMAL;
}
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_speed_xyz(double &dPercentSpeed)
{
dPercentSpeed = g_machine.s_machine_config._dXYZSpeed;
return SSI_STATUS_NORMAL;
}
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_set_speed_r(long z_speed)
{
g_machine.z._speed = z_speed;
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_settle_time()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_deadband()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_refresh_deadband()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Just get the values from g_machine.
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_position_xyz(double & dX, double & dY, double & dZ)
{
long lX=0, lY=0, lZ=0, lZm=0;
_send_cmd_MV_CMD_GET_POLL_59(lX, lY, lZ, lZm);
lX -= g_machine.s_machine_config.x_axis._neg_working_limit;
lY -= g_machine.s_machine_config.y_axis._neg_working_limit;
lZ -= g_machine.s_machine_config.z_axis._neg_working_limit;
dX = ScaleToMM(lX, g_machine.s_machine_config.x_axis._scale_resolution);
dY = ScaleToMM(lY, g_machine.s_machine_config.y_axis._scale_resolution);
dZ = ScaleToMM(lZ, g_machine.s_machine_config.z_axis._scale_resolution);
return SSI_STATUS_NORMAL;
};
//========================================================================
SSI_STATUS CMv_Proto::_set_position_xyz(AXISMOVE &X, AXISMOVE &Y, AXISMOVE &Z)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MOVE_TO_53;
pMV_CMD_01->S_MV_CMD_0x53.uSubCmdByte = 0;
pMV_CMD_01->S_MV_CMD_0x53.statusByte[0] = 1;
pMV_CMD_01->S_MV_CMD_0x53.statusByte[1] = 1;
pMV_CMD_01->S_MV_CMD_0x53.statusByte[2] = 1;
pMV_CMD_01->S_MV_CMD_0x53.statusByte[3] = 0;
pMV_CMD_01->S_MV_CMD_0x53.S_POS.x = X.to;
pMV_CMD_01->S_MV_CMD_0x53.S_POS.y = Y.to;
pMV_CMD_01->S_MV_CMD_0x53.S_POS.z = Z.to;
pMV_CMD_01->S_MV_CMD_0x53.S_SPEED.x = X.speed;
pMV_CMD_01->S_MV_CMD_0x53.S_SPEED.y = Y.speed;
pMV_CMD_01->S_MV_CMD_0x53.S_SPEED.z = Z.speed;
#pragma message("set accel and decel")
pMV_CMD_01->S_MV_CMD_0x53.S_ACC.x = X.acc;
pMV_CMD_01->S_MV_CMD_0x53.S_ACC.y = Y.acc;
pMV_CMD_01->S_MV_CMD_0x53.S_ACC.z = Z.acc;
pMV_CMD_01->S_MV_CMD_0x53.S_DEC.x = X.dec;
pMV_CMD_01->S_MV_CMD_0x53.S_DEC.y = Y.dec;
pMV_CMD_01->S_MV_CMD_0x53.S_DEC.z = Z.dec;
// swap the bytes for buffer sent to controller
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_POS.x));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_POS.y));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_POS.z));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_SPEED.x));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_SPEED.y));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_SPEED.z));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_ACC.x));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_ACC.y));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_ACC.z));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_DEC.x));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_DEC.y));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x53.S_DEC.z));
ep_buff[EP_01_CMD_IDX]._size = 0x60; // send 0x60 bytes over
ep_buff[EP_82_DATA_IDX]._size = 0x2; // expects 2 bytes back
// look at the start of the buffer
if (0)
{
long lMax = 60;
char * pch = ep_buff[EP_01_CMD_IDX]._buffer;
CString tmp;
for (long ii = 0 ; ii < lMax ; ++ii)
{
tmp.Format(_T("%X"), (unsigned char ) *(pch+ii));
TRACE1("Set Position %s", tmp);
}
TRACE0("\n");
}
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
}
//====================================================================================================================
// MV uses a proportional max accel and decel for all moves sample 10, 10, 1 move
//> [endpoint 0x00000001] 00000060 : 530001010100ffff2be6fffeea72ffffcd8e000000000003d08f0003ce20000061a100000000000f423b000f387d0001868200000000003d08ee003ce1f500061a07000000000000000000000000000000000000000000000000000000000000
// [6015605 ms] *Command : 53 Move To -- # X Y Z ZM Scale
// *Pos: -0054298 -0071054 -0012914 00000000
// *Vel: 00249999 00249376 00024993 00000000
// *Acc: 00999995 00997501 00099970 00000000
// *Dec: 03999982 03990005 00399879 00000000
//====================================================================================================================
SSI_STATUS CMv_Proto::_calculate_straightline_motion(AXISMOVE &X, AXISMOVE &Y, AXISMOVE &Z, double dSpeedMM)
{
double dTime=0.0;
double dXTime = 0.0, dYTime = 0.0, dZTime = 0.0;
double lSpeedXMM = ScaleToMM(g_machine.s_machine_config.x_axis._max_speed, g_machine.s_machine_config.x_axis._scale_resolution);
double lSpeedYMM = ScaleToMM(g_machine.s_machine_config.y_axis._max_speed, g_machine.s_machine_config.y_axis._scale_resolution);
double lSpeedZMM = ScaleToMM(g_machine.s_machine_config.z_axis._max_speed, g_machine.s_machine_config.z_axis._scale_resolution);
#pragma message("Add code to apply the speed")
if (lSpeedXMM)
dXTime = fabs((double)(X.dToMM-X.dFromMM)/lSpeedXMM);
if (lSpeedYMM)
dYTime = fabs((double)(Y.dToMM-Y.dFromMM)/lSpeedYMM);
if (lSpeedZMM)
dZTime = fabs((double)(Z.dToMM-Z.dFromMM)/lSpeedZMM);
dTime = (dXTime>dYTime)?dXTime:dYTime;
dTime = (dZTime>dTime)?dZTime:dTime;
double dDistance = sqrt( pow(X.dToMM-X.dFromMM, 2) + pow(Y.dToMM-Y.dFromMM, 2) + pow(Z.dToMM-Z.dFromMM, 2) );
double dMaxSpeed = dDistance/dTime;
double dSpeedFactor = dSpeedMM / dMaxSpeed;
dSpeedFactor = (dSpeedFactor > 1.0) ? 1.0 : dSpeedFactor;
double dXFactor = dSpeedFactor * dXTime/dTime;
double dYFactor = dSpeedFactor * dYTime/dTime;
double dZFactor = dSpeedFactor * dZTime/dTime;
// MV uses a proportional max accel and decel for all moves sample 10, 10, 1 move
//> [endpoint 0x00000001] 00000060 : 530001010100ffff2be6fffeea72ffffcd8e000000000003d08f0003ce20000061a100000000000f423b000f387d0001868200000000003d08ee003ce1f500061a07000000000000000000000000000000000000000000000000000000000000
// [6015605 ms] *Command : 53 Move To -- # X Y Z ZM Scale
// *Pos: -0054298 -0071054 -0012914 00000000
// *Vel: 00249999 00249376 00024993 00000000
// *Acc: 00999995 00997501 00099970 00000000
// *Dec: 03999982 03990005 00399879 00000000
X.speed = (long)(dXFactor * g_machine.s_machine_config.x_axis._max_speed);
X.acc = (long)(dXFactor * g_machine.s_machine_config.x_axis._max_accel);
X.dec = (long)(dXFactor * g_machine.s_machine_config.x_axis._max_decel);
Y.speed = (long)(dYFactor * g_machine.s_machine_config.y_axis._max_speed);
Y.acc = (long)(dYFactor * g_machine.s_machine_config.y_axis._max_accel);
Y.dec = (long)(dYFactor * g_machine.s_machine_config.y_axis._max_decel);
Z.speed = (long)(dZFactor * g_machine.s_machine_config.z_axis._max_speed);
Z.acc = (long)(dZFactor * g_machine.s_machine_config.z_axis._max_accel);
Z.dec = (long)(dZFactor * g_machine.s_machine_config.z_axis._max_decel);
return SSI_STATUS_NORMAL;
}
//========================================================================
// To do a move.
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_set_position_xyz(double dX, double dY, double dZ, bool bWait)
{
_poll_machine_58();
_poll_machine_59();
// get the current position
double dXStart, dYStart, dZStart;
mv_motion_get_position_xyz(dXStart, dYStart, dZStart);
AXISMOVE X;
AXISMOVE Y;
AXISMOVE Z;
X.dFromMM = dXStart;
X.dToMM = dX;
Y.dFromMM = dYStart;
Y.dToMM = dY;
Z.dFromMM = dZStart;
Z.dToMM = dZ;
X.from = MMtoScale(dXStart, g_machine.s_machine_config.x_axis._scale_resolution);
X.to = MMtoScale(dX, g_machine.s_machine_config.x_axis._scale_resolution);
Y.from = MMtoScale(dYStart, g_machine.s_machine_config.y_axis._scale_resolution);
Y.to = MMtoScale(dY, g_machine.s_machine_config.y_axis._scale_resolution);
Z.from = MMtoScale(dZStart, g_machine.s_machine_config.z_axis._scale_resolution);
Z.to = MMtoScale(dZ, g_machine.s_machine_config.z_axis._scale_resolution);
// move the position to make the -X, -Y, -Z position 0,0,0
X.to += g_machine.s_machine_config.x_axis._neg_working_limit;
Y.to += g_machine.s_machine_config.y_axis._neg_working_limit;
Z.to += g_machine.s_machine_config.z_axis._neg_working_limit;
X.from += g_machine.s_machine_config.x_axis._neg_working_limit;
Y.from += g_machine.s_machine_config.y_axis._neg_working_limit;
Z.from += g_machine.s_machine_config.z_axis._neg_working_limit;
_calculate_straightline_motion(X, Y, Z, g_machine.s_machine_config._dXYZSpeed);
_set_position_xyz(X, Y, Z);
#pragma message("Test settle wait comparing the status bit to the scale monitor")
if (bWait)
{
const long lSleep = 20;
const long lMaxLoopCnt = 20000/lSleep; // use max homing time of 20 seconds
long lLoopCnt = 0;
Sleep(lSleep);
_poll_machine_58();
_poll_machine_59();
while (!g_machine.s_status._bXYZZMIdle && lLoopCnt < lMaxLoopCnt)
{
_poll_machine_58();
_poll_machine_59();
Sleep(lSleep);
++lLoopCnt;
}
TRACE1("Presettle Time: %lf\n", TimeInSecs());
WaitForSettleXYZZM();
TRACE1("Postsettle Time: %lf\n", TimeInSecs());
}
return SSI_STATUS_NORMAL;
};
//========================================================================
// 43 10
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_position_r(double &dPositionR)
{
dPositionR = g_machine.r1._deg;
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_set_position_r(double dPositionR)
{
_send_cmd_MV_CMD_GET_X_INDEX_41(0x10); // 41 10
_send_cmd_MV_CMD_GET_Y_INDEX_42(0x10); // 42 10
_send_cmd_PRE_ROTARY();
_send_cmd_MV_CMD_GET_MAG_43(0x10); // 43 10
// Converts dPositionR to scale count.
long lCount = (long) (g_machine.s_machine_config.r1_axis._scale_resolution*dPositionR);
_send_cmd_MV_CMD_MOVE_AXIS_4C10(lCount);
Sleep(200);
// while ( g_machine.s_status._bRMoving) // wait for move to complete
// {
// Sleep(50);
// };
// once complete, we can update the true position.
g_machine.r1._deg = dPositionR;
return SSI_STATUS_NORMAL;
};
//========================================================================
// todo:
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_store_position_xyz()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// todo:
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_stored_positions_xyz()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// todo: Check 0x59 commands.
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_is_axis_moving()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// home position is the position of the magnetic mark calculated
// from the power off position.
// When the machine is powered off, it has a position.
//========================================================================
bool CMv_Proto::mv_motion_is_homed()
{
return(g_machine.s_machine_config.x_axis._pos_working_limit == 0 && g_machine.s_machine_config.x_axis._neg_working_limit == 0)?false:true;
}
//========================================================================
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_set_stage_limits()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// Stage Limit is .5" from the edge. so, it is
// Positive Limit = homing mark + (150 - (.5"25.4))
// Negative Limit = homing mark - (150 - (.5"25.4))
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_stage_limits()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// Do not implement.
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_dcc_scan_start()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// Do not implement.
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_dcc_scan_get_data_size()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_dcc_scan_get_data()
{
return SSI_STATUS_NORMAL;
}
//========================================================================
// Move the stage left/right until the index location is non-zero
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_Dcc_Home()
{
_get_config();
//========================================
// Get the current position
_poll_machine_59();
_send_cmd_MV_CMD_GET_MAG_43(0x03);
//========================================
// Read the index status from the controller
// if the returned 5E working_limit == 0, we need to home the machine
_send_cmd_MV_CMD_GET_WORKING_LIMITS_5E();
_get_xyz_index();
_send_cmd_MV_CMD_GET_CONFIG_69(0x01);
if (!(g_machine.s_machine_config.x_axis._pos_working_limit == 0 && g_machine.s_machine_config.x_axis._neg_working_limit == 0 ))
{
SetEvent(g_hHomedEvent);
return SSI_STATUS_NORMAL;
}
m_bHomingActive = true; // Tell the world we need to home the stage
// Seek Zm - Index Position
_send_cmd_MV_CMD_SEEK_INDEX_4F(0x03, 0x00);
// Don't know what this is
_send_cmd_MV_CMD_GET_CONFIG_69(0x01);
// Seek Z - Index Position
_send_cmd_MV_CMD_SEEK_INDEX_4F(0x02, 0x00);
Sleep(20);
_poll_machine_59();
_poll_machine_58();
TRACE0(" - waiting for Z to stop moving\n");
//========================================
// Wait until Z stopped moving
while (g_machine.s_status._bZMoving)
{
Sleep(50);
_poll_machine_59();
}
//=====================================
// get stage working limits
// move the Z to the top to clear the working area.
_send_cmd_MV_CMD_GET_WORKING_LIMITS_5E();
_send_cmd_MV_CMD_MOVE_AXIS_4C(0x02, g_machine.s_machine_config.z_axis._pos_working_limit, 1);
_poll_machine_59();
//=====================================
// Seek X- Index Positions
_send_cmd_MV_CMD_SEEK_INDEX_4F(0x00, 0x00);
// Seek Y- Index Positions
_send_cmd_MV_CMD_SEEK_INDEX_4F(0x01, 0x00);
_poll_machine_59();
_poll_machine_58();
TRACE0(" - waiting for X,Y,Zm to stop moving\n");
//========================================
// Wait until X-Y-Zm stopped moving
while (g_machine.s_status._bYMoving || g_machine.s_status._bXMoving || g_machine.s_status._bZMMoving)
{
Sleep(50);
_poll_machine_59();
}
//========================================
// 5e Get stage working limits after homing
_send_cmd_MV_CMD_GET_WORKING_LIMITS_5E();
// 5e Get state working limits to update to the real limits data
_send_cmd_MV_CMD_GET_WORKING_LIMITS_5E();
_get_xyz_index();
m_bHomingActive = false;
SetEvent(g_hHomedEvent);
return SSI_STATUS_NORMAL;
}
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_shut_down()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_fly_mode_cancel()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// From g_machine
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_axes_max_speed(double &dMaxSpeedX, double &dMaxSpeedY, double &dMaxSpeedZ)
{
dMaxSpeedX = g_machine.s_machine_config.x_axis._max_speed;
dMaxSpeedY = g_machine.s_machine_config.y_axis._max_speed;
dMaxSpeedZ = g_machine.s_machine_config.z_axis._max_speed;
return SSI_STATUS_NORMAL;
}
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_3D_max_speed(double &dMaxSpeed)
{
double dMaxSpeedX = g_machine.s_machine_config.x_axis._max_speed;
double dMaxSpeedY = g_machine.s_machine_config.y_axis._max_speed;
double dMaxSpeedZ = g_machine.s_machine_config.z_axis._max_speed;
dMaxSpeed = sqrt(dMaxSpeedX*dMaxSpeedX + dMaxSpeedY*dMaxSpeedY + dMaxSpeedZ*dMaxSpeedZ);
return SSI_STATUS_NORMAL;
}
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_motion_get_position_meas_point()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_is_supported()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_start_up()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
return SSI_STATUS_NORMAL;
};
//========================================================================
// 11 steps
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_get_magnification_steps(int &iSteps)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
iSteps = 11;
TRACE1("Optics Get Mag Steps: %X \r\n",iSteps);
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_get_numeric_aperture()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_get_magnification(int& iStep)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
iStep = g_machine.s_machine_config.zm_axis._mag_step;
TRACE1("Optics Get Mag : %X \r\n",g_machine.s_machine_config.zm_axis._mag_step);
return SSI_STATUS_NORMAL;
};
//========================================================================
/*
*Command : 4C 03 00 Set Mag 00002633 00009484 00024487 00097948
*Command : 4C 03 01 Set Mag -0000287 00009484 00024487 00097948
*Command : 4C 03 00 Set Mag 00000013 00009484 00024487 00097948
*Command : 4C 03 00 Set Mag 00005253 00009484 00024487 00097948
*Command : 4C 03 01 Set Mag -0000287 00009484 00024487 00097948
*Command : 4C 03 00 Set Mag 00000013 00009484 00024487 00097948
*Command : 4C 03 00 Set Mag 00007873 00009484 00024487 00097948
*/
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_set_magnification(int iStep)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
g_machine.s_machine_config.zm_axis._mag_step = iStep;
TRACE1("Optics Set Mag : %X \r\n",g_machine.s_machine_config.zm_axis._mag_step);
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_get_deadband()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_get_scale_range(long &neg_scale_range, long &pos_scale_range)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
neg_scale_range = g_machine.s_machine_config.zm_axis._neg_working_limit;
pos_scale_range = g_machine.s_machine_config.zm_axis._pos_working_limit;
neg_scale_range -= g_machine.s_machine_config.zm_axis._neg_working_limit;
pos_scale_range -= g_machine.s_machine_config.zm_axis._neg_working_limit;
TRACE2("Get Scale Range : %X, %X \r\n",neg_scale_range, pos_scale_range);
TRACE2("Get Scale Range : %X, %X \r\n",neg_scale_range, pos_scale_range);
return SSI_STATUS_NORMAL;
};
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_get_scale_position(long &lScale)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
_poll_machine_59();
lScale = g_machine.zm._pos_59;
lScale -= g_machine.s_machine_config.zm_axis._neg_working_limit;
TRACE1("get scale position : g_machine.s_machine_config.zm_axis._neg_working_limit = %X \r\n",g_machine.s_machine_config.zm_axis._neg_working_limit);
TRACE1(" scale position : %X \r\n",lScale);
return SSI_STATUS_NORMAL;
};
//========================================================================
// get scale first.
// if the target is backwards,
// set destination with 01 status
// set destination with 00 status
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_set_scale_position(long lScale)
{
// const long lSleep = 20;
// const long lMaxLoopCnt = 20000/lSleep; // use max homing time of 20 seconds
// long lLoopCnt = 0;
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
TRACE1("caller set scale position = %X \r\n", lScale);
lScale += g_machine.s_machine_config.zm_axis._neg_working_limit;
_poll_machine_59();
long lBacklashMove = g_machine.s_machine_config.zm_axis._slack;
long lLast = g_machine.zm._pos_59;
// if a negative move, overshoot and come back for backlash removal
if (lScale < g_machine.zm._pos_59)
{
long lDestination = lScale - lBacklashMove;
lDestination = (lDestination<g_machine.s_machine_config.zm_axis._neg_working_limit) ? g_machine.s_machine_config.zm_axis._neg_working_limit : lDestination;
_send_cmd_MV_CMD_MOVE_AXIS_4C(0x03, lDestination, 1);
TRACE1("set actual negative scale position = %X \r\n", lDestination);
g_machine.s_status._bZMMoving = true;
Sleep(50);
#pragma message("test status flags for move done")
{
while (g_machine.s_status._bZMMoving)
{
_poll_machine_59();
Sleep(50); // wait until it begins to move
TRACE0("Zm negative moving \r\n");
}
}
_poll_machine_59();
_poll_machine_58();
}
lLast = g_machine.zm._pos_59;
long lDestination = lScale;
lDestination = (lDestination>g_machine.s_machine_config.zm_axis._pos_working_limit) ? g_machine.s_machine_config.zm_axis._pos_working_limit : lDestination;
lDestination = (lDestination<g_machine.s_machine_config.zm_axis._neg_working_limit) ? g_machine.s_machine_config.zm_axis._neg_working_limit : lDestination;
TRACE1("set actual positive scale position = %X \r\n", lDestination);
_send_cmd_MV_CMD_MOVE_AXIS_4C(0x03, lDestination, 1);
_send_cmd_MV_CMD_MOVE_AXIS_4C(0x03, lDestination, 0);
#pragma message("test status flags to eliminate the sleep")
g_machine.s_status._bZMMoving = true;
Sleep(50);
while (g_machine.s_status._bZMMoving)
{
_poll_machine_59();
Sleep(50); // wait until it starts moving
TRACE0("Zm positive moving\r\n");
}
return SSI_STATUS_NORMAL;
}
//========================================================================
//
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_refresh_lens()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_enable_grid()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_is_grid_enabled()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_enable_laser()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Not implemented
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_is_laser_enabled()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// Nothing to do
//========================================================================
SSI_STATUS CMv_Proto::mv_optics_shut_down()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
// return true
//========================================================================
SSI_STATUS CMv_Proto::mv_light_is_supported(BOOL &bTrue)
{
bTrue = TRUE;
return SSI_STATUS_NORMAL;
};
//========================================================================
// Nothing to do. Just make sure g_machine is there.
//========================================================================
SSI_STATUS CMv_Proto::mv_light_start_up()
{
return SSI_STATUS_NORMAL;
};
//========================================================================
SSI_STATUS CMv_Proto::mv_light_get_lamp_count(int &iCount)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
iCount = g_machine.s_machine_config._nbr_lamps;
return SSI_STATUS_NORMAL;
};
//========================================================================
// Do nothing. g_machine gives you everything.
//========================================================================
SSI_STATUS CMv_Proto::mv_light_get_lamp_info()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
return SSI_STATUS_NORMAL;
};
////========================================================================
//// Do nothing. g_machine gives you everything.
////========================================================================
//SSI_STATUS CMv_Proto::mv_light_get_lamp_state()
//{
// return SSI_STATUS_NORMAL;
//};
//========================================================================
// ON/OFF?
//========================================================================
SSI_STATUS CMv_Proto::mv_light_set_lamp_state(double dBottomPercent, double dTopPercent)
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
if (g_machine.s_machine_config._vector_light_model == 3)
{
g_machine.s_lights_300._axial_light = (long)(dTopPercent/100.0 * (mvMAXLIGHTVALUE - 1));
g_machine.s_lights_300._bottom_light = (long)(dBottomPercent/100.0 * (mvMAXLIGHTVALUE - 1));
TRACE2("mv_light_set_lamp_state bottom: %ld top: %ld\n",
g_machine.s_lights_300._bottom_light, g_machine.s_lights_300._axial_light);
}
else
// if (m_pMv_Proto->g_machine.s_machine_config._vector_light_model == 2)
{
g_machine.s_lights_200._axial_light = (long)(dTopPercent/100.0 * (mvMAXLIGHTVALUE - 1));
g_machine.s_lights_200._bottom_light = (long)(dBottomPercent/100.0 * (mvMAXLIGHTVALUE - 1));
TRACE2("mv_light_set_lamp_state bottom: %ld top: %ld\n",
g_machine.s_lights_300._bottom_light, g_machine.s_lights_200._axial_light);
};
return SSI_STATUS_NORMAL;
}
//========================================================================
// Do nothing
//========================================================================
SSI_STATUS CMv_Proto::mv_light_set_light_off()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
if (g_machine.s_machine_config._vector_light_model == 3)
{
g_machine.s_lights_300._axial_light = 0;
g_machine.s_lights_300._bottom_light = 0;
}
else
// if (g_machine.s_machine_config._vector_light_model == 2)
{
g_machine.s_lights_200._axial_light = 0;
g_machine.s_lights_200._bottom_light = 0;
}
mv_set_full_ringlight_data(0);
mv_light_set_light();
return SSI_STATUS_NORMAL;
}
//========================================================================
//========================================================================
SSI_STATUS CMv_Proto::mv_light_set_light()
{
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
_send_cmd_MV_CMD_SET_LIGHT_6E();
return SSI_STATUS_NORMAL;
}
//========================================================================
//========================================================================
SSI_STATUS CMv_Proto::mv_pendant_enable(BOOL bTrue)
{
UNREFERENCED_PARAMETER(bTrue);
WaitForSingleObject(g_hHomedEvent, INFINITE); // machine start and homing is done
_send_cmd_MV_CMD_SET_JOYSTICK_MODE_47(bTrue);
return SSI_STATUS_NORMAL;
};
//========================================================================
// read the configuration from the controller and populate the g_machine
// data structure
// 1. Extract machine signature : 6f00
// 2. Get Limits
//========================================================================
SSI_STATUS CMv_Proto::_get_config()
{
_send_cmd_MV_CMD_START_MACHINE_2C(0x01);
// 50 Get Max Speed - axis set one
_send_cmd_MV_CMD_MAX_SPEED_50(0x00, 0x01, 0x11);
// 51 Get Max Acceleration - axis set one
_send_cmd_MV_CMD_MAX_ACCEL_51(0x00, 0x01, 0x11);
// 76 Get Max Deceleration - axis set one
_send_cmd_MV_CMD_MAX_DECEL_76(0x00, 1, 0x11);
// 5001 Get Max Speed - axis set two
_send_cmd_MV_CMD_MAX_SPEED_50(0x01, 0x02, 0x11);
// 5101 Get Max Acceleration - axis set two
_send_cmd_MV_CMD_MAX_ACCEL_51(0x01, 0x02, 0x11);
// 7601 Get Max Deceleration - axis set two
_send_cmd_MV_CMD_MAX_DECEL_76(0x01, 0x02, 0x11);
// 4103
_send_cmd_MV_CMD_GET_X_INDEX_41(0x03);
// 4203
_send_cmd_MV_CMD_GET_Y_INDEX_42(0x03);
// 4503
_send_cmd_MV_CMD_GET_ZOOM_DECEL_45(0x03);
_send_cmd_MV_CMD_GET_SCALE_SLACK_7C(0x03);
// 4303 - Get Mag Settings
_send_cmd_MV_CMD_GET_MAG_43(0x03);
_send_cmd_MV_CMD_GET_CONFIG_60();
// 5e Get state working limits
_send_cmd_MV_CMD_GET_WORKING_LIMITS_5E();
return SSI_STATUS_NORMAL;
}
//========================================================================
// read the configuration from the controller and populate the g_machine
// data structure
//========================================================================
SSI_STATUS CMv_Proto::_get_xyz_index()
{
_send_cmd_MV_CMD_GET_INDEX_4E(0x00, 0x02, 0x07); // Get X - Index
_send_cmd_MV_CMD_GET_INDEX_4E(0x01, 0x02, 0x07); // Get Y - Index
_send_cmd_MV_CMD_GET_INDEX_4E(0x02, 0x02, 0x07); // Get Z - Index
return SSI_STATUS_NORMAL;
}
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_POS_XYZ_00_02()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_POS_XYZ_00_02;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SET_POS_XYZ_00_03()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_SET_POS_XYZ_00_03;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_POS_R_00_04()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_POS_R_00_04;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SET_POS_R_00_05()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_SET_POS_R_00_05;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SET_ZOOM_00_06()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_SET_ZOOM_00_06;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_ZOOM_00_07()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_ZOOM_00_07;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_STARUP_CONFIG_00()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_STARUP_CONFIG_00;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_SUB_CONFIG_28()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_SUB_CONFIG_28;
ep_buff[EP_01_CMD_IDX]._size = 0x20;
ep_buff[EP_81_DATA_IDX]._size = 0x12;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//======================================================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_SUB_CONFIG_29(BYTE cmd0, DWORD addr, BYTE cmd1)
{
unsigned char x[4];
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
x[0] = *(((unsigned char *)&addr + 3));
x[1] = *(((unsigned char *)&addr + 2));
x[2] = *(((unsigned char *)&addr + 1));
x[3] = *(((unsigned char *)&addr));
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_SUB_CONFIG_29;
pMV_CMD_01->S_MV_CMD_0x29.cmd0 = cmd0;
// take the DWORD addr, create an array of bytes to force a little endian format.
memcpy((void *)(&pMV_CMD_01->S_MV_CMD_0x29.dAddr), x, 4);
pMV_CMD_01->S_MV_CMD_0x29.cmd1 = cmd1;
switch (cmd0)
{
case 0x00:
case 0x02:
ep_buff[EP_01_CMD_IDX]._size = 0x20;
ep_buff[EP_81_DATA_IDX]._size = 0x60;
break;
default:
ep_buff[EP_01_CMD_IDX]._size = 0x20;
ep_buff[EP_81_DATA_IDX]._size = 0x60;
break;
};
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SERVO_CMD_2B()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_SERVO_CMD_2B;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
}
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_START_MACHINE_2C(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_START_MACHINE_2C;
ep_buff[EP_01_CMD_IDX]._buffer[1] = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x10;
ep_buff[EP_81_DATA_IDX]._size = 0x20;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_31()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_31;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x20;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_32()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_32;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_34()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_34;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_35()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_35;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_3C()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_3C;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_X_INDEX_41(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_X_INDEX_41;
pMV_CMD_01->S_MV_CMD_0x41.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x02;
ep_buff[EP_81_DATA_IDX]._size = 0x06;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_Y_INDEX_42(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_Y_INDEX_42;
pMV_CMD_01->S_MV_CMD_0x42.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x02;
ep_buff[EP_81_DATA_IDX]._size = 0x06;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_MAG_43(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_MAG_43;
pMV_CMD_01->S_MV_CMD_0x43.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x02;
ep_buff[EP_81_DATA_IDX]._size = 0x06;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_ZOOM_DECEL_45(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_ZOOM_DECEL_45;
pMV_CMD_01->S_MV_CMD_0x45.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x02;
ep_buff[EP_81_DATA_IDX]._size = 0x06;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SET_JOYSTICK_MODE_47(BOOL bEnable)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_SET_JOYSTICK_MODE_47;
ep_buff[EP_01_CMD_IDX]._size = 0x10;
ep_buff[EP_81_DATA_IDX]._size = 0x02;
if (!bEnable)
{
ep_buff[EP_01_CMD_IDX]._buffer[1] = 0x01;
ep_buff[EP_01_CMD_IDX]._buffer[2] = 0x01;
ep_buff[EP_01_CMD_IDX]._buffer[3] = 0x01;
ep_buff[EP_01_CMD_IDX]._buffer[4] = 0x01;
};
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_MOVE_AXIS_4C10(long lCount)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MOVE_AXIS_4C;
pMV_CMD_01->S_MV_CMD_0x4C10.uAxis = 0x10;
pMV_CMD_01->S_MV_CMD_0x4C10.lR1_Pos = lCount;
pMV_CMD_01->S_MV_CMD_0x4C10.lX = g_machine.s_machine_config.x_axis._index_10;
pMV_CMD_01->S_MV_CMD_0x4C10.lY = g_machine.s_machine_config.y_axis._index_10;
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C10.lR1_Pos));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C10.lX));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C10.lY));
ep_buff[EP_01_CMD_IDX]._size = 0x1f;
ep_buff[EP_81_DATA_IDX]._size = 0x02;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_MOVE_AXIS_4C(BYTE Axis, long lDestination, BYTE lStatusByte)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MOVE_AXIS_4C;
pMV_CMD_01->S_MV_CMD_0x4C.uAxis = Axis;
#pragma message("what exactly does the message byte do")
pMV_CMD_01->S_MV_CMD_0x4C.statusByte = lStatusByte;
pMV_CMD_01->S_MV_CMD_0x4C.lPosition = lDestination;
switch (Axis)
{
case 0:
pMV_CMD_01->S_MV_CMD_0x4C.lSpeed = g_machine.s_machine_config.x_axis._max_speed;
pMV_CMD_01->S_MV_CMD_0x4C.lAcc = g_machine.s_machine_config.x_axis._max_accel;
pMV_CMD_01->S_MV_CMD_0x4C.lDecel = g_machine.s_machine_config.x_axis._max_decel;
break;
case 1:
pMV_CMD_01->S_MV_CMD_0x4C.lSpeed = g_machine.s_machine_config.y_axis._max_speed;
pMV_CMD_01->S_MV_CMD_0x4C.lAcc = g_machine.s_machine_config.y_axis._max_accel;
pMV_CMD_01->S_MV_CMD_0x4C.lDecel = g_machine.s_machine_config.y_axis._max_decel;
break;
case 2:
pMV_CMD_01->S_MV_CMD_0x4C.lSpeed = g_machine.s_machine_config.z_axis._max_speed;
pMV_CMD_01->S_MV_CMD_0x4C.lAcc = g_machine.s_machine_config.z_axis._max_accel;
pMV_CMD_01->S_MV_CMD_0x4C.lDecel = g_machine.s_machine_config.z_axis._max_decel;
break;
case 3:
pMV_CMD_01->S_MV_CMD_0x4C.lSpeed = g_machine.s_machine_config.zm_axis._max_speed;
pMV_CMD_01->S_MV_CMD_0x4C.lAcc = g_machine.s_machine_config.zm_axis._max_accel;
pMV_CMD_01->S_MV_CMD_0x4C.lDecel = g_machine.s_machine_config.zm_axis._max_decel;
break;
default:
break;
}
CString msg;
msg.Format(_T("_send_cmd_MV_CMD_MOVE_AXIS_4C Zoom move %ld %ld %ld %ld\n"),
pMV_CMD_01->S_MV_CMD_0x4C.lPosition,
pMV_CMD_01->S_MV_CMD_0x4C.lSpeed,
pMV_CMD_01->S_MV_CMD_0x4C.lAcc,
pMV_CMD_01->S_MV_CMD_0x4C.lDecel);
TRACE1("%s", msg);
if (0)
{
long lPos = 500;
pMV_CMD_01->S_MV_CMD_0x4C.lPosition = lPos;
pMV_CMD_01->S_MV_CMD_0x4C.lSpeed = 9000;
pMV_CMD_01->S_MV_CMD_0x4C.lAcc = 24000;
pMV_CMD_01->S_MV_CMD_0x4C.lDecel = 97000;
}
// swap the bytes for buffer sent to controller
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C.lPosition));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C.lSpeed));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C.lAcc));
_reverse_dword((DWORD *)&(pMV_CMD_01->S_MV_CMD_0x4C.lDecel));
ep_buff[EP_01_CMD_IDX]._size = 0x21;
ep_buff[EP_81_DATA_IDX]._size = 0x02;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_INDEX_4E(BYTE cmd0, BYTE send_len, BYTE recv_len)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_INDEX_4E;
pMV_CMD_01->S_MV_CMD_0x4E.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = send_len;
ep_buff[EP_81_DATA_IDX]._size = recv_len;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//======================================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SEEK_INDEX_4F(BYTE cmd0, BYTE cmd1)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_SEEK_INDEX_4F;
pMV_CMD_01->S_MV_CMD_0x4F.cmd0 = cmd0;
pMV_CMD_01->S_MV_CMD_0x4F.cmd1 = cmd1;
ep_buff[EP_01_CMD_IDX]._size = 0x03;
ep_buff[EP_81_DATA_IDX]._size = 0x02;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_MAX_SPEED_50(BYTE cmd0, BYTE send_len, BYTE recv_len)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MAX_SPEED_50;
ep_buff[EP_01_CMD_IDX]._buffer[1] = cmd0;
ep_buff[EP_01_CMD_IDX]._size = send_len;
ep_buff[EP_81_DATA_IDX]._size = recv_len;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_MAX_ACCEL_51(BYTE cmd0, BYTE send_len, BYTE recv_len)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MAX_ACCEL_51;
pMV_CMD_01->S_MV_CMD_0x50.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = send_len;
ep_buff[EP_81_DATA_IDX]._size = recv_len;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_MOVE_TO_53()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MOVE_TO_53;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_SCALE_58(long &lX, long &lY, long &lZ)
{
_poll_machine_58();
lX = g_machine.x._pos_58;
lY = g_machine.y._pos_58;
lZ = g_machine.z._pos_58;
return SSI_STATUS_NORMAL;
};
//=======================================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_POLL_59(long &lX, long &lY, long &lZ, long &lZM)
{
_poll_machine_59();
lX = g_machine.x._pos_59;
lY = g_machine.y._pos_59;
lZ = g_machine.z._pos_59;
lZM = g_machine.zm._pos_59;
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_WORKING_LIMITS_5E()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_WORKING_LIMITS_5E;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x78;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_CONFIG_60()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_CONFIG_60;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x7e;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_RAW_SCALE_63()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_RAW_SCALE_63;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_CONFIG_69(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_CONFIG_69;
pMV_CMD_01->S_MV_CMD_0x69.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x10;
ep_buff[EP_81_DATA_IDX]._size = 0x02;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_6A()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_6A;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_SET_LIGHT_6E()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
if (g_machine.s_machine_config._vector_light_model == 3)
{
// moved here form mv_light_set_light where it clearly does not belong as it is outside the USB mutex
pMV_CMD_01->uCmdByte = MV_CMD_SET_LIGHT_6E;
pMV_CMD_01->S_MV_CMD_300_0x6e.uSubCmdByte = 0;
memcpy(pMV_CMD_01->S_MV_CMD_300_0x6e.segment, g_machine.s_lights_300._segment, sizeof(g_machine.s_lights_300._segment[FIVE_RINGS][EIGHT_SEGS]));
pMV_CMD_01->S_MV_CMD_300_0x6e.bottom_light = g_machine.s_lights_300._bottom_light;
pMV_CMD_01->S_MV_CMD_300_0x6e.axial_light = g_machine.s_lights_300._axial_light;
memcpy(ep_buff[EP_01_CMD_IDX]._buffer+2, &(g_machine.s_lights_300), 0xfe);
unsigned char x[4];
for (int i=0;i<42;i++) // MAXSEGS_5*MAXRINGS_8 + 2 = 5*8 + 2
{
memcpy(x, (unsigned char *)(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4), 4);
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+0) = x[3];
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+1) = x[2];
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+2) = x[1];
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+3) = x[0];
};
}
else
// if (g_machine.s_machine_config._vector_light_model == 3)
{
pMV_CMD_01->uCmdByte = MV_CMD_SET_LIGHT_6E;
pMV_CMD_01->S_MV_CMD_200_0x6e.uSubCmdByte = 0;
memcpy(pMV_CMD_01->S_MV_CMD_200_0x6e.segment, g_machine.s_lights_200._segment, sizeof(g_machine.s_lights_200._segment[FIVE_RINGS][EIGHT_SEGS]));
pMV_CMD_01->S_MV_CMD_200_0x6e.bottom_light = g_machine.s_lights_200._bottom_light;
pMV_CMD_01->S_MV_CMD_200_0x6e.axial_light = g_machine.s_lights_200._axial_light;
memcpy(ep_buff[EP_01_CMD_IDX]._buffer+2, &(g_machine.s_lights_200), 0xfe);
unsigned char x[4];
for (int i=0;i<18;i++) // MAXSEGS_2*MAXRINGS_8 + 2 = 5*8 + 2 = 2*8 + 2
{
memcpy(x, (unsigned char *)(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4), 4);
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+0) = x[3];
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+1) = x[2];
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+2) = x[1];
*(ep_buff[EP_01_CMD_IDX]._buffer+2+i*4+3) = x[0];
};
};
pMV_CMD_01->uCmdByte = MV_CMD_SET_LIGHT_6E;
ep_buff[EP_01_CMD_IDX]._size = 0xfe;
ep_buff[EP_81_DATA_IDX]._size = 0x02;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
Sleep(10);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_MACHINE_SIGNATURE_6F(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_MACHINE_SIGNATURE_6F;
pMV_CMD_01->S_MV_CMD_0x6F.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x10;
ep_buff[EP_81_DATA_IDX]._size = 0xfe;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_LIGHT_CONFIG_70()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
unsigned char unk1[] = {0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0xe4, 0xfb, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00};
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_LIGHT_CONFIG_70;
memcpy((void *)(&(ep_buff[EP_01_CMD_IDX]._buffer[1])), unk1, 15);
ep_buff[EP_01_CMD_IDX]._size = 0x10;
ep_buff[EP_81_DATA_IDX]._size = 0xfe;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_71()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_71;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_74()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_74;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_UNK_75()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_UNK_75;
ep_buff[EP_01_CMD_IDX]._size = 0x01;
ep_buff[EP_81_DATA_IDX]._size = 0x45;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_MAX_DECEL_76(BYTE cmd0, BYTE send_len, BYTE recv_len)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_MAX_DECEL_76;
pMV_CMD_01->S_MV_CMD_0x76.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = send_len;
ep_buff[EP_81_DATA_IDX]._size = recv_len;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_SCALE_SLACK_7C(BYTE cmd0)
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_01_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
pMV_CMD_01->uCmdByte = MV_CMD_GET_SCALE_SLACK_7C;
pMV_CMD_01->S_MV_CMD_0x7C.cmd0 = cmd0;
ep_buff[EP_01_CMD_IDX]._size = 0x02;
ep_buff[EP_81_DATA_IDX]._size = 0x04;
_do_single_threaded_usb_comm(EP_01_CMD_IDX);
ReleaseMutex(g_hEP01_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_MV_CMD_GET_FINE_SCALE(long &lX, long &lY, long &lZ, long &lZm)
{
WaitForSingleObject(g_hEP02_Serial_Mutex, INFINITE);
memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
ep_buff[EP_02_CMD_IDX]._buffer[0] = 0x00;
ep_buff[EP_02_CMD_IDX]._buffer[1] = 0x01;
ep_buff[EP_02_CMD_IDX]._buffer[2] = 0x01;
ep_buff[EP_02_CMD_IDX]._buffer[3] = 0x01;
ep_buff[EP_02_CMD_IDX]._buffer[4] = 0x01;
ep_buff[EP_02_CMD_IDX]._buffer[5] = 0x01;
ep_buff[EP_02_CMD_IDX]._size = 0x06;
ep_buff[EP_82_DATA_IDX]._size = 0x10;
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
ReleaseMutex(g_hEP02_Serial_Mutex);
lX = g_machine.x._scale_pos;
lY = g_machine.y._scale_pos;
lZ = g_machine.z._scale_pos;
lZm = g_machine.zm._scale_pos;
return SSI_STATUS_NORMAL;
};
//=============================================================
// Send 0x6 bytes to the device
// 00 01 01 01 01 01
// Get 0x10 bytes from the device
// FF FF FF FF FF FF FF FD 00 00 06 0E FF FF FE 6B
// This is actually getting index value.
// Probably not useful.
//==============================================================
SSI_STATUS CMv_Proto::_send_cmd_PRE_ROTARY()
{
WaitForSingleObject(g_hEP01_Serial_Mutex, INFINITE);
memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
ep_buff[EP_02_CMD_IDX]._buffer[0] = 0;
ep_buff[EP_02_CMD_IDX]._buffer[1] = 1;
ep_buff[EP_02_CMD_IDX]._buffer[2] = 1;
ep_buff[EP_02_CMD_IDX]._buffer[3] = 1;
ep_buff[EP_02_CMD_IDX]._buffer[4] = 1;
ep_buff[EP_02_CMD_IDX]._buffer[5] = 1;
ep_buff[EP_02_CMD_IDX]._size = 0x6;
ep_buff[EP_82_DATA_IDX]._size = 0x10;
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
ReleaseMutex(g_hEP02_Serial_Mutex);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_SUB_CONFIG_28()
{
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_SERVO_CMD_2B()
{
memcpy((char *)g_machine.s_machine_config._str_servo_Id, ep_buff[EP_81_DATA_IDX]._buffer+1, 32);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_2C()
{
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_X_INDEX_41()
{
if (*(ep_buff[EP_81_DATA_IDX]._buffer+1) == 0x03)
{
g_machine.s_machine_config.x_axis._index_03 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_X_INDEX_41()_index_03 : %ld\n", g_machine.s_machine_config.x_axis._index_03);
}
else
if (*(ep_buff[EP_81_DATA_IDX]._buffer+1) == 0x10)
{
g_machine.s_machine_config.x_axis._index_10 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_X_INDEX_41()_index_10 : %ld\n", g_machine.s_machine_config.x_axis._index_10);
};
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_Y_INDEX_42()
{
if (*(ep_buff[EP_81_DATA_IDX]._buffer+1) == 0x03)
{
g_machine.s_machine_config.y_axis._index_03 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_Y_INDEX_42()_index_03 : %ld\n", g_machine.s_machine_config.y_axis._index_03);
}
else
if (*(ep_buff[EP_81_DATA_IDX]._buffer+1) == 0x10)
{
g_machine.s_machine_config.y_axis._index_10 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_Y_INDEX_42()_index_10 : %ld\n", g_machine.s_machine_config.y_axis._index_10);
};
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_MAG_43()
{
if (*(ep_buff[EP_81_DATA_IDX]._buffer+2) == 0x03)
{
g_machine.s_machine_config.zm_axis._index_03 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_MAG_43() : %ld\n", g_machine.s_machine_config.zm_axis._index_03);
}
else
if (*(ep_buff[EP_81_DATA_IDX]._buffer+2) == 0x10)
{
g_machine.s_machine_config.zm_axis._index_10 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_MAG_43() : %ld\n", g_machine.s_machine_config.zm_axis._index_10);
};
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_ZOOM_DECEL_45()
{
g_machine.s_machine_config.zm_axis._index_03 = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+2));
TRACE1("_process_MV_CMD_GET_ZOOM_DECEL_45() : %ld\n", g_machine.s_machine_config.zm_axis._index_03);
return SSI_STATUS_NORMAL;
}
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_INDEX_4E()
{
long lIdx = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+3));
switch (*(ep_buff[EP_01_CMD_IDX]._buffer+1))
{
case 0 : // X-Index
g_machine.s_machine_config.x_axis._index_03 = lIdx;
break;
case 1 : // Y-Index
g_machine.s_machine_config.y_axis._index_03 = lIdx;
break;
case 2 : // Z - Index
g_machine.s_machine_config.z_axis._index_03 = lIdx;
break;
default:
return SSI_STATUS_DATALINK_ERROR;
};
return SSI_STATUS_NORMAL;
}
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_MAX_SPEED_50()
{
g_machine.s_machine_config.x_axis._max_speed = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+1));
g_machine.s_machine_config.y_axis._max_speed = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+5));
g_machine.s_machine_config.z_axis._max_speed = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+9));
g_machine.s_machine_config.zm_axis._max_speed = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+13));
TRACE3("_process_MV_CMD_MAX_SPEED_50() x,y,z: %ld %ld %ld\n", g_machine.s_machine_config.x_axis._max_speed,
g_machine.s_machine_config.y_axis._max_speed,
g_machine.s_machine_config.z_axis._max_speed);
TRACE1("_process_MV_CMD_MAX_SPEED_50() Zm : %ld\n", g_machine.s_machine_config.zm_axis._max_speed);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_MAX_ACCEL_51()
{
g_machine.s_machine_config.x_axis._max_accel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+1));
g_machine.s_machine_config.y_axis._max_accel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+5));
g_machine.s_machine_config.z_axis._max_accel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+9));
g_machine.s_machine_config.zm_axis._max_accel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+13));
TRACE3("_process_MV_CMD_MAX_ACCEL_51() x,y,z: %ld %ld %ld\n", g_machine.s_machine_config.x_axis._max_accel,
g_machine.s_machine_config.y_axis._max_accel,
g_machine.s_machine_config.z_axis._max_accel);
TRACE1("_process_MV_CMD_MAX_ACCEL_51() Zm : %ld\n", g_machine.s_machine_config.zm_axis._max_accel);
return SSI_STATUS_NORMAL;
};
//==============================================================
//
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_UNK_56()
{
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_SCALE_58()
{
memcpy(&(g_machine.x._pos_58), ep_buff[EP_81_DATA_IDX]._buffer+1, 4);
_reverse_dword((DWORD *)&(g_machine.x._pos_58));
memcpy(&(g_machine.y._pos_58), ep_buff[EP_81_DATA_IDX]._buffer+1+4, 4);
_reverse_dword((DWORD *)&(g_machine.y._pos_58));
memcpy(&(g_machine.z._pos_58), ep_buff[EP_81_DATA_IDX]._buffer+1+4*2, 4);
_reverse_dword((DWORD *)&(g_machine.z._pos_58));
memcpy(&(g_machine.zm._pos_58), ep_buff[EP_81_DATA_IDX]._buffer+1+4*3, 4);
_reverse_dword((DWORD *)&(g_machine.zm._pos_58));
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_POLL_59()
{
CString Tmp;
ASSERT(ep_buff[EP_81_DATA_IDX]._buffer[0]);
memcpy(&(g_machine.x._pos_59), ep_buff[EP_81_DATA_IDX]._buffer+1+45, 4);
_reverse_dword((DWORD *)&(g_machine.x._pos_59));
memcpy(&(g_machine.y._pos_59), ep_buff[EP_81_DATA_IDX]._buffer+1+49, 4);
_reverse_dword((DWORD *)&(g_machine.y._pos_59));
memcpy(&(g_machine.z._pos_59), ep_buff[EP_81_DATA_IDX]._buffer+1+53, 4);
_reverse_dword((DWORD *)&(g_machine.z._pos_59));
memcpy(&(g_machine.zm._pos_59), ep_buff[EP_81_DATA_IDX]._buffer+1+57, 4);
_reverse_dword((DWORD *)&(g_machine.zm._pos_59));
long lXIdle = *(ep_buff[EP_81_DATA_IDX]._buffer+16);
long lYIdle = *(ep_buff[EP_81_DATA_IDX]._buffer+17);
long lZIdle = *(ep_buff[EP_81_DATA_IDX]._buffer+18);
long lZMIdle = *(ep_buff[EP_81_DATA_IDX]._buffer+19);
g_machine.s_status._bXMoving = lXIdle == 0 ? true : false;
g_machine.s_status._bYMoving = lYIdle == 0 ? true : false;
g_machine.s_status._bZMoving = lZIdle == 0 ? true : false;
g_machine.s_status._bZMMoving = lZMIdle == 0 ? true : false;
g_machine.s_status._bXYZZMIdle = (lXIdle + lYIdle + lZIdle + lZMIdle == 4) ? true : false;
TRACE1("_bXYZZMIdle %ld\n", g_machine.s_status._bXYZZMIdle);
Tmp.Format(_T("_process_MV_CMD_GET_POLL_59() %lf: _save_cmd %X ep_buff[81] %X x %ld y %ld z %ld zm %ld x_pos %ld y_pos %ld z_pos %ld zm-pos %ld \r\n"),
TimeInSecs(),
ep_buff[EP_01_CMD_IDX]._save_send_cmd,
ep_buff[EP_81_DATA_IDX]._buffer[0],
lXIdle, lYIdle, lZIdle, lZMIdle,
g_machine.x._pos_59,
g_machine.y._pos_59,
g_machine.z._pos_59,
g_machine.zm._pos_59);
TRACE1("%s", Tmp);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_WORKING_LIMITS_5E()
{
memcpy(&(g_machine.s_machine_config.x_axis._neg_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.x_axis._neg_working_limit));
memcpy(&(g_machine.s_machine_config.y_axis._neg_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*1, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.y_axis._neg_working_limit));
memcpy(&(g_machine.s_machine_config.z_axis._neg_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*2, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.z_axis._neg_working_limit));
memcpy(&(g_machine.s_machine_config.zm_axis._neg_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*3, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.zm_axis._neg_working_limit));
memcpy(&(g_machine.s_machine_config.x_axis._pos_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*4, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.x_axis._pos_working_limit));
memcpy(&(g_machine.s_machine_config.y_axis._pos_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*5, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.y_axis._pos_working_limit));
memcpy(&(g_machine.s_machine_config.z_axis._pos_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*6, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.z_axis._pos_working_limit));
memcpy(&(g_machine.s_machine_config.zm_axis._pos_working_limit), ep_buff[EP_81_DATA_IDX]._buffer+5+4*7, 4);
_reverse_dword((DWORD *)&(g_machine.s_machine_config.zm_axis._pos_working_limit));
CString Tmp;
Tmp.Format(_T("_process_MV_CMD_GET_WORKING_LIMITS_5E() +:- xL-%ld yL-%ld zL-%ld zmL-%ld xH-%ld yH-%ld zH-%ld zmH-%ld\n"),
g_machine.s_machine_config.x_axis._pos_working_limit,
g_machine.s_machine_config.x_axis._neg_working_limit,
g_machine.s_machine_config.y_axis._pos_working_limit,
g_machine.s_machine_config.y_axis._neg_working_limit,
g_machine.s_machine_config.z_axis._pos_working_limit,
g_machine.s_machine_config.z_axis._neg_working_limit,
g_machine.s_machine_config.zm_axis._pos_working_limit,
g_machine.s_machine_config.zm_axis._neg_working_limit );
TRACE1("%s", Tmp);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_CONFIG_60()
{
memcpy((char *)g_machine.s_machine_config._str_serial_no, ep_buff[EP_81_DATA_IDX]._buffer+1, 32);
memcpy((char *)g_machine.s_machine_config._str_model, ep_buff[EP_81_DATA_IDX]._buffer+1+32, 32);
memcpy((char *)g_machine.s_machine_config._str_model_nbr, ep_buff[EP_81_DATA_IDX]._buffer+1+32+32, 32);
if (wcsstr(g_machine.s_machine_config._str_model_nbr, L"220"))
g_machine.s_machine_config._vector_light_model = 2;
else if (wcsstr(g_machine.s_machine_config._str_model_nbr, L"310"))
g_machine.s_machine_config._vector_light_model = 3;
else
g_machine.s_machine_config._vector_light_model = 3;
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_CONFIG_69()
{
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_SET_LIGHT_6E()
{
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_LIGHT_CONFIG_70()
{
if (g_machine.s_machine_config._vector_light_model == 3)
memcpy((char *)g_machine.s_lights_300._segment, ep_buff[EP_81_DATA_IDX]._buffer+1, EIGHT_SEGS*FIVE_RINGS*4+8);
else
// if (g_machine.s_machine_config._vector_light_model == 3)
memcpy((char *)g_machine.s_lights_200._segment, ep_buff[EP_81_DATA_IDX]._buffer+1, EIGHT_SEGS*TWO_RINGS*4+8);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_MAX_DECEL_76()
{
g_machine.s_machine_config.x_axis._max_decel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+1));
g_machine.s_machine_config.y_axis._max_decel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+5));
g_machine.s_machine_config.z_axis._max_decel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+9));
g_machine.s_machine_config.zm_axis._max_decel = _4char2long((unsigned char*)(ep_buff[EP_81_DATA_IDX]._buffer+13));
TRACE3("_process_MV_CMD_MAX_DECEL_76() x,y,z: %ld %ld %ld\n", g_machine.s_machine_config.x_axis._max_decel,
g_machine.s_machine_config.y_axis._max_decel,
g_machine.s_machine_config.z_axis._max_decel);
TRACE1("_process_MV_CMD_MAX_DECEL_76() Zm : %ld\n", g_machine.s_machine_config.zm_axis._max_decel);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_SCALE_SLACK_7C()
{
union
{
int iValue;
char c_array[4];
};
memset (c_array, 0, 4);
c_array[0] = *(ep_buff[EP_81_DATA_IDX]._buffer+3);
c_array[1] = *(ep_buff[EP_81_DATA_IDX]._buffer+2);
g_machine.s_machine_config.zm_axis._slack = iValue;
TRACE1("_process_MV_CMD_GET_SCALE_SLACK_7C() Zm : %ld\n", iValue);
return SSI_STATUS_NORMAL;
};
//==============================================================
SSI_STATUS CMv_Proto::_process_MV_CMD_GET_FINE_SCALE()
{
memcpy(&(g_machine.x._scale_pos), ep_buff[EP_82_DATA_IDX]._buffer, 4);
_reverse_dword((DWORD *)&(g_machine.x._scale_pos));
memcpy(&(g_machine.y._scale_pos), ep_buff[EP_82_DATA_IDX]._buffer+4*1, 4);
_reverse_dword((DWORD *)&(g_machine.y._scale_pos));
memcpy(&(g_machine.z._scale_pos), ep_buff[EP_82_DATA_IDX]._buffer+4*2, 4);
_reverse_dword((DWORD *)&(g_machine.z._scale_pos));
memcpy(&(g_machine.zm._scale_pos), ep_buff[EP_82_DATA_IDX]._buffer+4*3, 4);
_reverse_dword((DWORD *)&(g_machine.zm._scale_pos));
CString Tmp;
Tmp.Format(_T("_process_MV_CMD_GET_FINE_SCALE() +:- x-%ld y-%ld z-%ld zm-%ld\n"),
g_machine.x._scale_pos,
g_machine.y._scale_pos,
g_machine.z._scale_pos,
g_machine.zm._scale_pos );
TRACE1("%s", Tmp);
return SSI_STATUS_NORMAL;
};
#pragma message("Add error reporting and dbug logging in the HSI for when the move settle fails")
//===============================================================================
// not sure what To Do if the settle testing fails. Should this genreate errors
// to indicate a creeping stage and increased settle parameters?
// retry count is the number of extra times To Do the stage moving test
// bandwidth is the maximum motion in a single watch time
// timeout is the maximum time to wait for a sub bandwidth move
//===============================================================================
SSI_STATUS CMv_Proto::WaitForSettleXYZZM()
{
// if TP active in DCC or rach mode then dont wait for settle
MV_TRACE(_T("Enter CSsi::WaitForSettleXYZZM\n"));
static bool bTest=true;
//if ( bTest )
// if ( m_lTPEnable && (m_lTPMode==0 || m_lTPMode==3) )
// {
// MV_TRACE(_T("Exit CSsi::WaitForSettleXYZZM m_lTPEnable && (m_lTPMode==0 || m_lTPMode==3\n"));
// return SSI_STATUS_NORMAL;
// }
// if homing is active then we dont need to wait for this settle
if ( m_bHomingActive )
{
MV_TRACE(_T("Enter CSsi::WaitForSettleXYZZM Homing active\n"));
return SSI_STATUS_NORMAL;
}
long lSettledMask = 0;
long XSettled = 0x00000001;
long YSettled = 0x00000002;
long ZSettled = 0x00000004;
long ZMSettled = 0x00000008;
long AllSettled = 0x000000F;
long XTimedOut = 0x00010000;
long YTimedOut = 0x00020000;
long ZTimedOut = 0x00040000;
long ZMTimedOut = 0x00080000;
long AllTimeouts =0x000F0000;
long lStartX = 0;
long lStartY = 0;
long lStartZ = 0;
long lStartZM = 0;
// long lStartR = 0;
// long Reserved;
for ( int ii = 0 ; ii < 0 ; ++ii )
{
double dStartTime = TimeInSecs();
_send_cmd_MV_CMD_GET_POLL_59(lStartX, lStartY, lStartZ, lStartZM);
CString msg;
msg.Format(_T("\nSettlePositionTrace: Sec: %lf XYZZM: %ld %ld %ld %ld"),
dStartTime, lStartX, lStartY, lStartZ, lStartZM);
TRACE1("%s", msg);
Sleep(100);
}
CSettleStageParams cParams;
_send_cmd_MV_CMD_GET_POLL_59(lStartX, lStartY, lStartZ, lStartZM);
double dStartTime = TimeInSecs();
long lXDeadband = (long)(cParams.EDGE_RETRY_BANDWIDTH_X * 1000.0 * g_machine.s_machine_config.x_axis._scale_resolution);
long lYDeadband = (long)(cParams.EDGE_RETRY_BANDWIDTH_Y * 1000.0 * g_machine.s_machine_config.y_axis._scale_resolution);
long lZDeadband = (long)(cParams.EDGE_RETRY_BANDWIDTH_Z * 1000.0 * g_machine.s_machine_config.z_axis._scale_resolution);
long lZMDeadband = (long)(cParams.EDGE_RETRY_BANDWIDTH_MAG/2000000.0);
double dScaleTestIncr = 0.15;
long lX=0,lY=0,lZ=0, lZM=0;
//long lR=0, lReserved=0;
TRACE1("\nSettle start time %lf\n\n", dStartTime);
double dMaxSettleTimeSec=0.0;
dMaxSettleTimeSec = (cParams.EDGE_RETRY_TIMEOUT_X/1000.0 < dMaxSettleTimeSec)?dMaxSettleTimeSec:cParams.EDGE_RETRY_TIMEOUT_X/1000.0;
dMaxSettleTimeSec = (cParams.EDGE_RETRY_TIMEOUT_Y/1000.0 < dMaxSettleTimeSec)?dMaxSettleTimeSec:cParams.EDGE_RETRY_TIMEOUT_Y/1000.0;
dMaxSettleTimeSec = (cParams.EDGE_RETRY_TIMEOUT_Z/1000.0 < dMaxSettleTimeSec)?dMaxSettleTimeSec:cParams.EDGE_RETRY_TIMEOUT_Z/1000.0;
dMaxSettleTimeSec = (cParams.EDGE_RETRY_TIMEOUT_MAG/1000.0 < dMaxSettleTimeSec)?dMaxSettleTimeSec:cParams.EDGE_RETRY_TIMEOUT_MAG/1000.0;
CSettleStage cXAxis(1, dStartTime, lStartX, lXDeadband, dScaleTestIncr, 5*dMaxSettleTimeSec);
CSettleStage cYAxis(2, dStartTime, lStartY, lYDeadband, dScaleTestIncr, 5*dMaxSettleTimeSec);
CSettleStage cZAxis(3, dStartTime, lStartZ, lZDeadband, dScaleTestIncr, 5*dMaxSettleTimeSec);
CSettleStage cZMAxis(4, dStartTime, lStartZM, lZMDeadband, dScaleTestIncr, 5*dMaxSettleTimeSec);
// if the axis time increment has passed and the stage has not moved more than the
// bandwidth then it has settled. If the max settle time widow has expired
// then it failed to settle
// loop until or one has timed out or all settled
while ( !(AllTimeouts&lSettledMask) && ((AllSettled&lSettledMask) != AllSettled) )
{
Sleep(10);
double dCurTime = TimeInSecs();
enum SETTLE_STATUS SettleStatus = NOTSETTLED;
_send_cmd_MV_CMD_GET_POLL_59(lX, lY, lZ, lZM);
TRACE1("time: %lf\n", dCurTime);
SettleStatus = cXAxis.Test(dCurTime, lX);
TRACE1("X Test Status %ld\n", SettleStatus);
#ifdef _DEBUG
if ( SettleStatus == TIMEDOUT ) TRACE0("X settle timeout\n");
if ( SettleStatus == SETTLED ) TRACE0("X settled\n");
#endif
lSettledMask = (SettleStatus == SETTLED)?(lSettledMask |XSettled):lSettledMask;
lSettledMask = (SettleStatus == TIMEDOUT)?(lSettledMask |XTimedOut):lSettledMask;
SettleStatus = cYAxis.Test(dCurTime, lY);
TRACE1("Y Test Status %ld\n", SettleStatus);
#ifdef _DEBUG
if ( SettleStatus == TIMEDOUT ) TRACE0("Y settle timeout\n");
if ( SettleStatus == SETTLED ) TRACE0("Y settled\n");
#endif
lSettledMask = (SettleStatus == SETTLED)?lSettledMask |= YSettled:lSettledMask;
lSettledMask = (SettleStatus == TIMEDOUT)?lSettledMask |= YTimedOut:lSettledMask;
SettleStatus = cZAxis.Test(dCurTime, lZ);
TRACE1("Z Test Status %ld\n", SettleStatus);
#ifdef _DEBUG
if ( SettleStatus == TIMEDOUT ) TRACE0("Z settle timeout\n");
if ( SettleStatus == SETTLED ) TRACE0("Z settled\n");
#endif
lSettledMask = (SettleStatus == SETTLED)?lSettledMask |= ZSettled:lSettledMask;
lSettledMask = (SettleStatus == TIMEDOUT)?lSettledMask |= ZTimedOut:lSettledMask;
SettleStatus = cZMAxis.Test(dCurTime, lZM);
TRACE1("ZM Test Status %ld\n", SettleStatus);
#ifdef _DEBUG
if ( SettleStatus == TIMEDOUT ) TRACE0("ZM settle timeout\n");
if ( SettleStatus == SETTLED ) TRACE0("ZM settled\n");
#endif
lSettledMask = (SettleStatus == SETTLED)?lSettledMask |= ZMSettled:lSettledMask;
lSettledMask = (SettleStatus == TIMEDOUT)?lSettledMask |= ZMTimedOut:lSettledMask;
}
TRACE1("CSsi::WaitForSettle exit status %X", lSettledMask);
TRACE2("\nSettle finish time %lf Elapsed: %lf\n\n", TimeInSecs(), TimeInSecs()-dStartTime);
if ( (AllSettled&lSettledMask) == AllSettled )
{
TRACE0(" - no timeout\n");
MV_TRACE(_T("Exit CSsi::WaitForSettleXYZZM normal\n"));
return SSI_STATUS_NORMAL;
}
else
{
TRACE0(" - timeout\n");
MV_TRACE(_T("Exit CSsi::WaitForSettleXYZZM timeout\n"));
return SSI_STATUS_ERROR;
}
}
CSettleStage::CSettleStage(long lAxis, double dStartTime, long lStart, long lDeadband, double dTestIncrSec, double dMaxTimeSec)
{
m_dStartTime = dStartTime;
m_lStartPos = lStart;
m_lDeadband = lDeadband;
m_dTestIncrSec = dTestIncrSec;
m_dMaxTimeSec = dMaxTimeSec;
m_dIncrStartTimeSec = m_dStartTime;
m_lAxis = lAxis;
}
enum SETTLE_STATUS CSettleStage::Test(double dCurTime, long lCurPos)
{
if ( dCurTime - m_dStartTime > m_dMaxTimeSec )
{
TRACE1("CSettleStage::Test Axis: %ld Final TIMEDOUT\n", m_lAxis);
ASSERT(0);
return TIMEDOUT;
}
if ( dCurTime - m_dIncrStartTimeSec > m_dTestIncrSec )
{
if ( abs(lCurPos - m_lStartPos) <= m_lDeadband )
{
TRACE2("settle test Axis: %ld %lf Settled\n", m_lAxis, dCurTime);
return SETTLED;
}
else
{
CString msg;
msg.Format(_T("Settle test Axis: %ld Incr timeout cur time: %lf, inc start time: %lf cur pos: %ld start pos %ld\n"), m_lAxis, dCurTime, m_dIncrStartTimeSec, lCurPos, m_lStartPos);
TRACE1("%s", msg);
m_lStartPos = lCurPos;
m_dIncrStartTimeSec = dCurTime;
}
}
return NOTSETTLED;
}