Add rotary control panel.
This commit is contained in:
@@ -2719,10 +2719,11 @@ SSI_STATUS_MOTION CSO7_Proto::_process_replay_capture_commands(char *inBuff, FIL
|
||||
};
|
||||
|
||||
//******************************************************************************
|
||||
usb_dev_handle* CSO7_Proto::_open_usb_dev(void)
|
||||
usb_dev_handle* CSO7_Proto::_open_usb_dev(unsigned short sSeqNumber)
|
||||
{
|
||||
struct usb_bus *bus = NULL;
|
||||
struct usb_device *dev = NULL;
|
||||
usb_dev_handle *udev = NULL;
|
||||
|
||||
for (bus = usb_get_busses(); bus; bus = bus->next)
|
||||
{
|
||||
@@ -2730,13 +2731,51 @@ usb_dev_handle* CSO7_Proto::_open_usb_dev(void)
|
||||
{
|
||||
if (dev->descriptor.idVendor == SEVENOCEAN_VID && dev->descriptor.idProduct == SEVENOCEAN_PID)
|
||||
{
|
||||
return usb_open(dev);
|
||||
udev = usb_open(dev);
|
||||
usb_claim_interface(udev, 0);
|
||||
|
||||
if(Get_SeqNumber(udev) != sSeqNumber)
|
||||
{
|
||||
usb_close(udev);
|
||||
}
|
||||
else
|
||||
{
|
||||
return udev;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
int CSO7_Proto::Get_SeqNumber(usb_dev_handle *udev)
|
||||
{
|
||||
memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
|
||||
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer) = CT_DATA;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_READ_SEQ_NUMBER;
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x02;
|
||||
ep_buff[EP_82_DATA_IDX]._size = 0x01;
|
||||
|
||||
int _ret;
|
||||
_ret = usb_bulk_write(udev, ep_buff[2]._ep, (char *)ep_buff[2]._buffer,(int) ep_buff[2]._size, 50);
|
||||
if (_ret < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
_ret = usb_bulk_read(udev, ep_buff[3]._ep, (char *)ep_buff[3]._buffer,(int) ep_buff[3]._size, 5000);
|
||||
if (_ret < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
g_machine.SEQ_NUMBER = -1;
|
||||
g_machine.SEQ_NUMBER = *(ep_buff[EP_82_DATA_IDX]._buffer);
|
||||
return g_machine.SEQ_NUMBER;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
// Send is direct and async.
|
||||
// The receive thread will receive data and interpret it.
|
||||
@@ -2754,8 +2793,8 @@ SSI_STATUS_MOTION CSO7_Proto::Init_SO7Usb()
|
||||
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();
|
||||
usb_status = usb_find_devices(); // find all connected devices
|
||||
g_dev = _open_usb_dev(USB_SEQ_NUMBER);
|
||||
if (!g_dev)
|
||||
{
|
||||
MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK|MB_ICONERROR);
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#define USB_DEVICE_DESCRIPTOR_TYPE 1
|
||||
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
|
||||
#define USB_SEQ_NUMBER 0
|
||||
|
||||
#define THREAD_RUNNING_STATE1 0
|
||||
#define THREAD_RUNNING_STATE2 2
|
||||
@@ -337,10 +338,11 @@ public:
|
||||
static struct_so7_machine g_machine;
|
||||
|
||||
|
||||
int Get_SeqNumber(usb_dev_handle *udev);
|
||||
SSI_STATUS_MOTION Init_SO7Usb();
|
||||
SSI_STATUS_MOTION Exit_SO7Usb();
|
||||
|
||||
usb_dev_handle* _open_usb_dev(void);
|
||||
usb_dev_handle* _open_usb_dev(unsigned short sSeqNumber);
|
||||
SSI_STATUS_MOTION _do_single_threaded_usb_comm(int iEP);
|
||||
|
||||
SSI_STATUS_MOTION _read_data_8x(int iEP_Base);
|
||||
|
||||
@@ -0,0 +1,752 @@
|
||||
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "SO7_Proto_Aux.h"
|
||||
#include "math.h"
|
||||
|
||||
|
||||
|
||||
#define MY_CONFIG 1
|
||||
#define MAX_DEVPATH_LENGTH 256
|
||||
#define ENDPOINT_TIMEOUT 500
|
||||
#define MAX_IN_BUFF_SIZE 1024
|
||||
|
||||
//***** Static Data *****
|
||||
static char *outBuff = NULL;
|
||||
struct_so7_r_ep_buff CSO7_Proto_Aux::ep_buff[lEPSIZE];
|
||||
//================================================================
|
||||
int CSO7_Proto_Aux::g_hEP8x_Thread_State=THREAD_PAUSED;
|
||||
HANDLE CSO7_Proto_Aux::g_hEP8x_Thread_Id=NULL;
|
||||
|
||||
//================================================================
|
||||
int CSO7_Proto_Aux::g_hEP02_Thread_State=THREAD_PAUSED;
|
||||
HANDLE CSO7_Proto_Aux::g_hEP02_Thread_Id=NULL;
|
||||
HANDLE CSO7_Proto_Aux::g_hEP02_Serial_Mutex;
|
||||
|
||||
//================================================================
|
||||
struct_so7_r_machine CSO7_Proto_Aux::g_machine;
|
||||
usb_dev_handle *CSO7_Proto_Aux::g_dev=NULL;
|
||||
CLogger *CSO7_Proto_Aux::g_pLogger1;
|
||||
HANDLE CSO7_Proto_Aux::g_hHomedEvent = NULL;
|
||||
CLogger* g_pLog1=NULL;
|
||||
|
||||
//******************************************************************************
|
||||
CSO7_Proto_Aux::CSO7_Proto_Aux()
|
||||
{
|
||||
ep_buff[EP_01_CMD_IDX]._ep = EP_S07_01;
|
||||
ep_buff[EP_81_DATA_IDX]._ep = EP_S07_81;
|
||||
ep_buff[EP_02_CMD_IDX]._ep = EP_S07_02;
|
||||
ep_buff[EP_82_DATA_IDX]._ep = EP_S07_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;
|
||||
};
|
||||
for (int i=0;i<20;i++)
|
||||
{
|
||||
for (int j=0;j<2;j++)
|
||||
{
|
||||
g_machine.GetInterruptMsg[i][j]=0;
|
||||
}
|
||||
}
|
||||
g_machine.IsSupportReadInterrputMsg=FALSE;
|
||||
g_machine.IsOffline=TRUE;
|
||||
g_machine.FPGAData=0;
|
||||
g_machine.FirmwareVer=FirmwareVer_3_X_R;
|
||||
g_machine.r._Move_Speed_Gear =2;
|
||||
g_machine.r._MoveTo_Speed_Gear =0;
|
||||
g_machine.r._pos_fixed._long_ =0;
|
||||
g_machine.r._ZSignal_pos._long_=0;
|
||||
|
||||
g_machine.r._d_cur_pos_ = 0;
|
||||
g_machine.ADC_Number=0;
|
||||
g_machine.ADC_Value =0;
|
||||
g_machine.Sys_Reset_Flag=0;
|
||||
g_machine.cVerNumber=3;
|
||||
g_machine.dRotaryCirclDis=100;
|
||||
g_machine.SEQ_NUMBER=0;
|
||||
g_machine.s_machine_r_config.r_axis._scale_resolution=0.5;
|
||||
|
||||
g_machine.s_machine_r_config.r_axis._neg_working_limit=0;
|
||||
|
||||
g_machine.s_machine_r_config.r_axis._MoveToSpeed[0]=0.0;
|
||||
g_machine.s_machine_r_config.r_axis._MoveToSpeed[1]=0.0;
|
||||
g_machine.s_machine_r_config.r_axis._MotionSpeedScale=1.0;
|
||||
|
||||
g_machine.s_machine_r_config.motion._EnCloseLoop=FALSE;
|
||||
g_machine.s_machine_r_config.motion._RetryTimes=5;
|
||||
g_machine.s_machine_r_config.motion._ShiftPositionR=0.0;
|
||||
|
||||
g_machine.s_machine_r_config.motion.GetInterruptMsgMethod=E_GET_INTERRUPT_MSG_INTERRUPT;//E_GET_INTERRUPT_MSG_INQUIRY;
|
||||
g_machine.s_machine_r_config.motion.m_WriteDataSleepTime=0;
|
||||
g_machine.s_machine_r_config.motion.m_AccuraErrPulseR=1;
|
||||
g_machine.s_machine_r_config.motion.m_EQUIDIS_R=0;
|
||||
|
||||
g_machine.s_machine_r_config.motion.m_SDK3000_CntThreadSleepVal=550000;
|
||||
g_machine.s_machine_r_config.motion.m_SV4000E_DenoisePara[0]=70;
|
||||
g_machine.s_machine_r_config.motion.m_SV4000E_DenoisePara[1]=70;
|
||||
g_machine.s_machine_r_config.motion.m_SV4000E_DenoisePara[2]=70;
|
||||
g_machine.s_machine_r_config.motion.m_SV4000E_DenoisePara[3]=70;
|
||||
|
||||
g_machine.s_machine_r_config.motion.m_MachineType=MACHINE_SO7_R_CONTROLLER;
|
||||
g_machine.s_machine_r_config.motion.m_VideoCardType=0;
|
||||
|
||||
g_machine.s_rstatus._bIsZMMotionFinished=0;
|
||||
g_machine.r._scale_pos._long_ = 0;
|
||||
g_machine.r._d_cur_pos_ = 0;
|
||||
g_machine.r._dSet_Zero_Pos = 0.0;
|
||||
g_machine.r._lSet_Zero_Pos = 0;
|
||||
g_machine.s_machine_r_config._dRSpeed[0] = 50;
|
||||
g_machine.s_machine_r_config._dRSpeed[1] = 50;
|
||||
g_machine.InterruptFlag[0]=0;
|
||||
g_machine.InterruptFlag[1]=0;
|
||||
g_machine.InPortStatus=0;
|
||||
m_bHomingActive = false;
|
||||
g_pLogger1 = new CLogger(_T("\\UtilityDebug.Log"));
|
||||
g_pLogger1->Send(_T("Construct Cso7_Proto.\r\n"));
|
||||
};
|
||||
|
||||
//******************************************************************************
|
||||
CSO7_Proto_Aux::~CSO7_Proto_Aux()
|
||||
{
|
||||
for (int i=0;i<lEPSIZE;i++)
|
||||
{
|
||||
free(ep_buff[i]._buffer);
|
||||
};
|
||||
if (g_pLogger1)
|
||||
g_pLogger1->Send(_T("Destruct Cso7_Proto.\r\n"));
|
||||
delete g_pLogger1;
|
||||
g_pLogger1 = NULL;
|
||||
}
|
||||
|
||||
#pragma warning(disable:4996)
|
||||
//******************************************************************************
|
||||
// Send is direct and async.
|
||||
// The receive thread will receive data and interpret it.
|
||||
//******************************************************************************
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::Init_SO7Usb()
|
||||
{
|
||||
//Set initial state of the machine
|
||||
g_machine.s_rstatus._machine_running = false;
|
||||
SSI_STATUS_MOTION rStatus=SSI_STATUS_MOTION_NORMAL;
|
||||
g_machine.IsOffline=FALSE;
|
||||
|
||||
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(USB_R_SEQ_NUMBER);
|
||||
if (!g_dev)
|
||||
{
|
||||
MessageBox(NULL, _T("Unable to open device"), _T("Message"), MB_OK|MB_ICONERROR);
|
||||
g_pLogger1->SendAndFlushPerMode(_T("Unable to open device %s \r\n"), usb_strerror());
|
||||
g_machine.IsOffline=TRUE;
|
||||
rStatus= SSI_STATUS_MOTION_DATALINK_ERROR;
|
||||
}
|
||||
else if (usb_set_configuration(g_dev, MY_CONFIG) < 0)
|
||||
{
|
||||
MessageBox(NULL, _T("Unable to SET CONFIGURATION"), _T("Message"), MB_OK|MB_ICONERROR);
|
||||
g_machine.IsOffline=TRUE;
|
||||
rStatus=SSI_STATUS_MOTION_DATALINK_ERROR;
|
||||
}
|
||||
else if (usb_claim_interface(g_dev, 0) < 0)
|
||||
{
|
||||
usb_close(g_dev);
|
||||
MessageBox(NULL, _T("Unable to CLAIM DEVICE"), _T("Message"), MB_OK|MB_ICONERROR);
|
||||
g_machine.IsOffline=TRUE;
|
||||
rStatus=SSI_STATUS_MOTION_DATALINK_ERROR;
|
||||
}
|
||||
|
||||
g_pLogger1->SendAndFlushPerMode(_T("Init:Open device succeed .\r\n"));
|
||||
|
||||
// ********************************************************************
|
||||
// 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_STATE1;
|
||||
|
||||
// ********************************************************************
|
||||
// Prepare and start EP_S07_81 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_hEP8x_Thread_State = THREAD_PAUSED;
|
||||
g_hEP8x_Thread_Id = CreateThread( (LPSECURITY_ATTRIBUTES) NULL,
|
||||
0,
|
||||
(LPTHREAD_START_ROUTINE) g_EP8x_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
|
||||
|
||||
return rStatus;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::Exit_SO7Usb()
|
||||
{
|
||||
SSI_STATUS_MOTION Status=SSI_STATUS_MOTION_NORMAL;
|
||||
|
||||
g_hEP8x_Thread_State = THREAD_EXIT;
|
||||
g_hEP02_Thread_State = THREAD_EXIT;
|
||||
|
||||
SetEvent(ep_buff[EP_82_DATA_IDX]._event);
|
||||
if (g_hEP8x_Thread_Id)
|
||||
{
|
||||
DWORD dwCode = STILL_ACTIVE;
|
||||
while (dwCode == STILL_ACTIVE)
|
||||
{
|
||||
GetExitCodeThread(g_hEP8x_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_82_DATA_IDX]._event);
|
||||
CloseHandle(ep_buff[EP_82_DATA_IDX]._event);
|
||||
SetEvent(ep_buff[EP_02_CMD_IDX]._event);
|
||||
CloseHandle(ep_buff[EP_02_CMD_IDX]._event);
|
||||
g_hEP02_Thread_State = THREAD_EXIT;
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
CloseHandle(g_hEP02_Serial_Mutex);
|
||||
|
||||
g_pLogger1->SendAndFlushPerMode(_T("Exit: Exit_SO7Usb \r\n"));
|
||||
return Status;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
usb_dev_handle* CSO7_Proto_Aux::_open_usb_dev(unsigned short sSeqNumber)
|
||||
{
|
||||
struct usb_bus *bus = NULL;
|
||||
struct usb_device *dev = NULL;
|
||||
usb_dev_handle *udev = NULL;
|
||||
|
||||
for (bus = usb_get_busses(); bus; bus = bus->next)
|
||||
{
|
||||
for (dev = bus->devices; dev; dev = dev->next)
|
||||
{
|
||||
if (dev->descriptor.idVendor == SEVENOCEAN_VID && dev->descriptor.idProduct == SEVENOCEAN_PID)
|
||||
{
|
||||
udev = usb_open(dev);
|
||||
usb_claim_interface(udev, 0);
|
||||
|
||||
if(Get_R_SeqNumber(udev) != sSeqNumber)
|
||||
{
|
||||
usb_close(udev);
|
||||
}
|
||||
else
|
||||
{
|
||||
return udev;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
int CSO7_Proto_Aux::Get_R_SeqNumber(usb_dev_handle *udev)
|
||||
{
|
||||
memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
|
||||
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer) = CT_DATA;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_READ_SEQ_NUMBER;
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x02;
|
||||
ep_buff[EP_82_DATA_IDX]._size = 0x01;
|
||||
|
||||
int _ret;
|
||||
_ret = usb_bulk_write(udev, ep_buff[2]._ep, (char *)ep_buff[2]._buffer,(int)ep_buff[2]._size, 50);
|
||||
if (_ret < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
_ret = usb_bulk_read(udev, ep_buff[3]._ep, (char *)ep_buff[3]._buffer,(int)ep_buff[3]._size, 5000);
|
||||
if (_ret < 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
g_machine.SEQ_NUMBER = -1;
|
||||
g_machine.SEQ_NUMBER = *(ep_buff[EP_82_DATA_IDX]._buffer);
|
||||
return g_machine.SEQ_NUMBER;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
// Worker Thread to serialize EP_S07_02 commands.
|
||||
//===========================================================================
|
||||
unsigned __stdcall CSO7_Proto_Aux::g_EP02_Thread(LPVOID pThis)
|
||||
{
|
||||
CSO7_Proto_Aux* _This = (CSO7_Proto_Aux*)pThis;
|
||||
for (;;)
|
||||
{
|
||||
if (g_hEP02_Thread_State == THREAD_EXIT)
|
||||
ExitThread(0);
|
||||
WaitForSingleObject(ep_buff[EP_02_CMD_IDX]._event,INFINITE);
|
||||
switch (g_hEP02_Thread_State)
|
||||
{
|
||||
case THREAD_EXIT:
|
||||
{
|
||||
ExitThread(0);
|
||||
}
|
||||
case THREAD_PAUSED:
|
||||
break;
|
||||
case THREAD_RUNNING_STATE1:
|
||||
{
|
||||
_This->_send_usb_cmd(EP_02_CMD_IDX);
|
||||
break;
|
||||
}
|
||||
case THREAD_RUNNING_STATE2:
|
||||
{
|
||||
_This->_write_usb_data_only(EP_02_CMD_IDX);
|
||||
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 CSO7_Proto_Aux::g_EP8x_Thread(LPVOID pThis)
|
||||
{
|
||||
CSO7_Proto_Aux* _This = (CSO7_Proto_Aux*)pThis;
|
||||
for (;;)
|
||||
{
|
||||
if (g_hEP8x_Thread_State == THREAD_EXIT)
|
||||
ExitThread(0);
|
||||
WaitForSingleObject(ep_buff[EP_82_DATA_IDX]._event, INFINITE);
|
||||
switch (g_hEP8x_Thread_State)
|
||||
{
|
||||
case THREAD_EXIT:
|
||||
{
|
||||
ExitThread(0);
|
||||
}
|
||||
case THREAD_PAUSED:
|
||||
break;
|
||||
case THREAD_RUNNING_STATE1:
|
||||
{
|
||||
_This->_read_data_8x(EP_81_DATA_IDX);
|
||||
break;
|
||||
}
|
||||
case THREAD_RUNNING_STATE2:
|
||||
{
|
||||
_This->_read_data_8x(EP_82_DATA_IDX);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ExitThread(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//===============================================================================
|
||||
// _send_usb_cmd(iEP) sends data to the corresponding iEP channel.
|
||||
// iEP = EP_S07_01 / EP_S07_02 EP_S07_01 = 0x01; EP_S07_02 = 0x02;
|
||||
//===============================================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_usb_cmd(int iEP_Base)
|
||||
{
|
||||
if (g_machine.IsOffline)
|
||||
{
|
||||
SetEvent(ep_buff[iEP_Base+1]._event);
|
||||
ep_buff[iEP_Base]._hProtoPending = false;
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
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];
|
||||
|
||||
_ret = usb_bulk_write(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 50);
|
||||
if (_ret < 0)
|
||||
{
|
||||
TRACE("Write Timeout \n");
|
||||
ASSERT(0);
|
||||
return SSI_STATUS_MOTION_TIMEOUT;
|
||||
}
|
||||
|
||||
SetEvent(ep_buff[iEP_Base+1]._event);
|
||||
ep_buff[iEP_Base]._hProtoPending = false;
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
|
||||
//===============================================================================
|
||||
// _write_usb_data_only(iEP) sends data to the corresponding iEP channel.No need to
|
||||
//process the reap async
|
||||
// iEP = EP_S07_01 / EP_S07_02 EP_S07_01 = 0x01; EP_S07_02 = 0x02;
|
||||
//===============================================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_write_usb_data_only(int iEP_Base)
|
||||
{
|
||||
if (g_machine.IsOffline)
|
||||
{
|
||||
ep_buff[iEP_Base]._hProtoPending = false;
|
||||
ep_buff[iEP_Base+1]._hProtoPending = false;
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
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_cmd() iEP : %X - ep_buff[iEP]._save_send_cmd : %X ._buffer[0] : %X\r\n", iEP_Base, ep_buff[iEP_Base]._save_send_cmd, ep_buff[iEP_Base]._buffer[0]);
|
||||
|
||||
_ret = usb_bulk_write(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 50);
|
||||
if (_ret < 0)
|
||||
{
|
||||
TRACE("Write Timeout \n");
|
||||
ASSERT(0);
|
||||
return SSI_STATUS_MOTION_TIMEOUT;
|
||||
}
|
||||
ep_buff[iEP_Base]._hProtoPending = false;
|
||||
ep_buff[iEP_Base+1]._hProtoPending = false;
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
|
||||
//===============================================================================
|
||||
// iEP_Base : EP_81_DATA_IDX/EP_82_DATA_IDX
|
||||
//===============================================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_read_data_8x(int iEP_Base)
|
||||
{
|
||||
if (g_machine.IsOffline)
|
||||
{
|
||||
ep_buff[EP_82_DATA_IDX]._hProtoPending = false;
|
||||
ep_buff[EP_01_CMD_IDX]._hProtoPending = false;
|
||||
ep_buff[EP_81_DATA_IDX]._hProtoPending = false;
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
if (iEP_Base == EP_82_DATA_IDX)
|
||||
{
|
||||
int _ret;
|
||||
_ret = usb_bulk_read(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 5000);
|
||||
if (_ret > 0)
|
||||
{
|
||||
_process_rcv_transfer_data(iEP_Base);
|
||||
ep_buff[EP_82_DATA_IDX]._hProtoPending = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE1("Read Timeout %xx\n", *((char *)ep_buff[iEP_Base]._buffer));
|
||||
ASSERT(0);
|
||||
return SSI_STATUS_MOTION_TIMEOUT;
|
||||
}
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
else
|
||||
{
|
||||
int _ret;
|
||||
_ret = usb_interrupt_read(g_dev, ep_buff[iEP_Base]._ep, (char *)ep_buff[iEP_Base]._buffer,(int) ep_buff[iEP_Base]._size, 20);
|
||||
if (_ret > 0)
|
||||
{
|
||||
_process_rcv_transfer_data(iEP_Base);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_machine.InterruptFlag[0] = 0;
|
||||
TRACE1("There is no data interrupt read from controller. %xx\n", *((char *)ep_buff[iEP_Base]._buffer));
|
||||
}
|
||||
|
||||
ep_buff[EP_01_CMD_IDX]._hProtoPending = false;
|
||||
ep_buff[EP_81_DATA_IDX]._hProtoPending = false;
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
// 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 CSO7_Proto_Aux::_process_rcv_transfer_data(int iEP)
|
||||
{
|
||||
switch (iEP)
|
||||
{
|
||||
case EP_01_CMD_IDX :
|
||||
TRACE0("_process_rcv_transfer_data() : Update EP_01_CMD_IDX.\r\n");
|
||||
break;
|
||||
case EP_82_DATA_IDX : //
|
||||
if(ep_buff[EP_02_CMD_IDX]._save_send_cmd == CT_DATA)
|
||||
{
|
||||
switch (ep_buff[EP_02_CMD_IDX]._save_send_cmd0)
|
||||
{
|
||||
case CT_READ_AXISXYZ:
|
||||
_process_SO7_CMD_READ_AXIS_R();
|
||||
break;
|
||||
case CT_READ_SEC_REALY:
|
||||
_process_SO7_CMD_READ_ZSIGNAL_POS_R();
|
||||
break;
|
||||
|
||||
default:
|
||||
TRACE1("_process_rcv_transfer_data() : Unknown ep_buff[EP_02_CMD_IDX]._save_send_cmd : %X \r\n", ep_buff[EP_02_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;
|
||||
};
|
||||
}
|
||||
break;
|
||||
case EP_02_CMD_IDX :
|
||||
TRACE0("_process_rcv_transfer_data() : Update EP_02_CMD_IDX.\r\n");
|
||||
break;
|
||||
case EP_81_DATA_IDX :
|
||||
|
||||
TRACE0("_process_rcv_transfer_data() : Update EP_81_DATA_IDX.\r\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
};
|
||||
|
||||
//******************************************************************************
|
||||
// Kick the g_hEP01_Thread_Event to get the g_EP01_Thread going.
|
||||
// iEP = EP_S07_01 or EP_S07_02 = 0x01 or 0x02
|
||||
//******************************************************************************
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_do_single_threaded_usb_comm(int 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;
|
||||
|
||||
if (iEP_Base == EP_01_CMD_IDX)
|
||||
SetEvent(ep_buff[EP_82_DATA_IDX]._event);
|
||||
else
|
||||
SetEvent(ep_buff[iEP_Base]._event);
|
||||
while ((ep_buff[iEP_Base]._hProtoPending == TRUE) || (ep_buff[iEP_Base+1]._hProtoPending == TRUE))
|
||||
{
|
||||
Sleep(3);
|
||||
}
|
||||
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_process_SO7_CMD_READ_AXIS_R()
|
||||
{
|
||||
g_machine.r._scale_pos._long_=0;
|
||||
g_machine.r._scale_pos._char_[2] = *(ep_buff[EP_82_DATA_IDX]._buffer);
|
||||
g_machine.r._scale_pos._char_[1] = *(ep_buff[EP_82_DATA_IDX]._buffer+1);
|
||||
g_machine.r._scale_pos._char_[0] = *(ep_buff[EP_82_DATA_IDX]._buffer+2);
|
||||
g_machine.r._scale_pos._char_[3] = 0;
|
||||
if (g_machine.r._scale_pos._long_ > 8388608)
|
||||
g_machine.r._scale_pos._long_ = g_machine.r._scale_pos._long_ - 16777216;
|
||||
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
};
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_process_SO7_CMD_READ_ZSIGNAL_POS_R()
|
||||
{
|
||||
g_machine.r._ZSignal_pos._char_[2] = *(ep_buff[EP_82_DATA_IDX]._buffer);
|
||||
g_machine.r._ZSignal_pos._char_[1] = *(ep_buff[EP_82_DATA_IDX]._buffer+1);
|
||||
g_machine.r._ZSignal_pos._char_[0] = *(ep_buff[EP_82_DATA_IDX]._buffer+2);
|
||||
g_machine.r._ZSignal_pos._char_[3] = 0;
|
||||
|
||||
if (g_machine.r._ZSignal_pos._long_ > 8388608)
|
||||
g_machine.r._ZSignal_pos._long_=g_machine.r._ZSignal_pos._long_-16777216;
|
||||
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_cmd_SO7_CMD_RESET_R(int iType)
|
||||
{
|
||||
iType++;
|
||||
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) = CT_SCALE;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_SET_RESET_FLAG;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+2) = 0x01;
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x03;
|
||||
ep_buff[EP_82_DATA_IDX]._size = 0x02;
|
||||
|
||||
g_hEP02_Thread_State=THREAD_RUNNING_STATE2;
|
||||
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
};
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_cmd_SO7_CMD_MOVE_R(int iType, int iMoveAngle)
|
||||
{
|
||||
WaitForSingleObject(g_hEP02_Serial_Mutex, INFINITE);
|
||||
memset(ep_buff[EP_02_CMD_IDX]._buffer, 0x00, MAX_BUFF_SIZE);
|
||||
|
||||
g_machine.r._pos_fixed._long_ = (ONE_R_PULSE * iMoveAngle / 360);
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer) = CT_MOTOR;
|
||||
if(iType)
|
||||
{
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_MOVETOY;
|
||||
}
|
||||
else
|
||||
{
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_MOVETOX;
|
||||
}
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+2)=(((g_machine.r._pos_fixed._char_[3])<0x80)?(g_machine.r._pos_fixed._char_[2]):((g_machine.r._pos_fixed._char_[2])|0x80));//×î¸ßλ
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+3)=(g_machine.r._pos_fixed._char_[1]);
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+4)=(g_machine.r._pos_fixed._char_[0]);
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x07;
|
||||
ep_buff[EP_81_DATA_IDX]._size = 0x07;
|
||||
|
||||
g_hEP02_Thread_State = THREAD_RUNNING_STATE2;
|
||||
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
};
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_cmd_SO7_CMD_READ_AXIS_R()
|
||||
{
|
||||
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) = CT_DATA;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_READ_AXISXYZ;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+2)=0x00;
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x03;
|
||||
ep_buff[EP_82_DATA_IDX]._size = 0x09;
|
||||
|
||||
g_hEP02_Thread_State=THREAD_RUNNING_STATE1;
|
||||
g_hEP8x_Thread_State=THREAD_RUNNING_STATE2;
|
||||
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
};
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_cmd_SO7_CMD_READ_ZSIGNAL_POS_R(int iType)
|
||||
{
|
||||
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) = CT_DATA;
|
||||
if(iType)
|
||||
{
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_READ_SEC_REALY;
|
||||
}
|
||||
else
|
||||
{
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_READ_SEC_REALX;
|
||||
}
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+2)=0;
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x03;
|
||||
ep_buff[EP_82_DATA_IDX]._size = 0x03;
|
||||
|
||||
g_hEP02_Thread_State=THREAD_RUNNING_STATE1;
|
||||
g_hEP8x_Thread_State=THREAD_RUNNING_STATE2;
|
||||
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
|
||||
//******************************************************************************
|
||||
long CSO7_Proto_Aux::GetRCurrentPosition(int iType)
|
||||
{
|
||||
long ztos = -1;
|
||||
_send_cmd_SO7_CMD_READ_AXIS_R();
|
||||
_send_cmd_SO7_CMD_READ_ZSIGNAL_POS_R(iType);
|
||||
ztos = abs(g_machine.r._scale_pos._long_ - g_machine.r._ZSignal_pos._long_);
|
||||
if(ztos > 8388608)
|
||||
{
|
||||
ztos = ztos - 9413433;
|
||||
}
|
||||
|
||||
return (ztos * 360 / 4720000);
|
||||
}
|
||||
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_cmd_SO7_CMD_STOP_R(int iType)
|
||||
{
|
||||
iType++;
|
||||
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) = CT_MOTOR;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_STOPA;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+2)=0x00;
|
||||
|
||||
TRACE("[STOP_R]\n");
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x04;
|
||||
ep_buff[EP_81_DATA_IDX]._size = 0x04;
|
||||
|
||||
g_hEP02_Thread_State=THREAD_RUNNING_STATE2;
|
||||
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
};
|
||||
|
||||
//==============================================================
|
||||
SSI_STATUS_MOTION CSO7_Proto_Aux::_send_cmd_SO7_CMD_SET_SEQ_NUMBER()
|
||||
{
|
||||
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) = CT_DATA;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+1) = CT_WRITE_SEQ_NUMBER;
|
||||
*(ep_buff[EP_02_CMD_IDX]._buffer+2)=g_machine.SEQ_NUMBER;
|
||||
|
||||
ep_buff[EP_02_CMD_IDX]._size = 0x03;
|
||||
ep_buff[EP_81_DATA_IDX]._size = 0x45;
|
||||
|
||||
g_hEP02_Thread_State=THREAD_RUNNING_STATE2;
|
||||
_do_single_threaded_usb_comm(EP_02_CMD_IDX);
|
||||
ReleaseMutex(g_hEP02_Serial_Mutex);
|
||||
return SSI_STATUS_MOTION_NORMAL;
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
// protocol for control SevenOcean's Machine
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
#ifndef AFX_SO7_Proto_Aux_H__B422904C_2CEB_495B_B7BD_B45AB30286DD__INCLUDED_
|
||||
#define AFX_SO7_Proto_Aux_H__B422904C_2CEB_495B_B7BD_B45AB30286DD__INCLUDED_
|
||||
|
||||
#if _MSC_VER > 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER > 1000
|
||||
|
||||
#include "..\Tools\UsbUtility\logger.h"
|
||||
#include "CMD_H.h"
|
||||
#include "..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Include\lusb0_usb.h"
|
||||
#include "..\MicroVu\SsiStatus.h"
|
||||
|
||||
#define MAX_BUFF_SIZE 0x200
|
||||
#define USB_R_SEQ_NUMBER 1
|
||||
#define RSPEEDGEAR 1
|
||||
#define ONE_R_PULSE 590000
|
||||
#define TYPER1 0
|
||||
#define TYPER2 1
|
||||
|
||||
#define USB_ENDPOINT_TYPE_CONTROL 0
|
||||
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 1
|
||||
#define USB_ENDPOINT_TYPE_BULK 2
|
||||
#define USB_ENDPOINT_TYPE_INTERRUPT 3
|
||||
|
||||
#define USB_DEVICE_DESCRIPTOR_TYPE 1
|
||||
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
|
||||
|
||||
#define THREAD_RUNNING_STATE1 0
|
||||
#define THREAD_RUNNING_STATE2 2
|
||||
#define THREAD_PAUSED 1
|
||||
#define THREAD_EXIT -1
|
||||
|
||||
// Device configuration and interface id.
|
||||
#define SO7_USB_CONFIG 1
|
||||
#define SO7_USB_INTF 0
|
||||
|
||||
#define EP_S07_01 0x01
|
||||
#define EP_S07_02 0x02
|
||||
#define EP_S07_03 0x03
|
||||
#define EP_S07_81 0x81
|
||||
#define EP_S07_82 0x82
|
||||
#define EP_S07_84 0x84
|
||||
|
||||
#define EP_01_CMD_IDX 0 // index to usb buffers
|
||||
#define EP_81_DATA_IDX 1 //
|
||||
#define EP_02_CMD_IDX 2 //
|
||||
#define EP_82_DATA_IDX 3 //
|
||||
#define EP_03_CMD_IDX 4 //
|
||||
#define EP_84_DATA_IDX 5 //
|
||||
|
||||
#define lEPSIZE 6
|
||||
#define MAXRINGS 5 // for MicroVu Vertex 220
|
||||
#define MAXSEGS 8
|
||||
|
||||
#define TWO_RINGS 2
|
||||
#define EIGHT_SEGS 8
|
||||
#define FIVE_RINGS 5
|
||||
|
||||
enum EMACHINERTYPE
|
||||
{
|
||||
MACHINE_SO7_R_CONTROLLER,
|
||||
MACHINE_METRONICS_CONTROLLER_R,
|
||||
MACHINE_TOTAL_R=255
|
||||
};
|
||||
enum EFirmwareRVer
|
||||
{
|
||||
FirmwareVer_3_X_R=0,
|
||||
FirmwareVer_6_X_R,
|
||||
FirmwareVer_Total_R
|
||||
};
|
||||
|
||||
#pragma pack(push)
|
||||
#pragma pack(1)
|
||||
//****************************************************************************************************
|
||||
// Set the _status to Idle after reply data has been received.
|
||||
// How to recover? In order to send data, _status must be Idle. If the system is not available
|
||||
// for 1 second, assume something wrong and treat it as "TimeOut".
|
||||
// Another way to do this is to lock this structure is to use a mutex to ensure single-threaded
|
||||
// access.
|
||||
//****************************************************************************************************
|
||||
//====================================================================================================
|
||||
|
||||
typedef struct s_so7_r_axis // axis parameters
|
||||
{
|
||||
char _Move_Speed_Gear;
|
||||
char _MoveTo_Speed_Gear;
|
||||
union
|
||||
{
|
||||
long _long_;
|
||||
char _char_[4];
|
||||
}_pos_fixed;
|
||||
union
|
||||
{
|
||||
long _long_;
|
||||
char _char_[4];
|
||||
}_scale_pos;
|
||||
union
|
||||
{
|
||||
long _long_;
|
||||
char _char_[4];
|
||||
}_ZSignal_pos;
|
||||
double _d_cur_pos_;
|
||||
long _scale_probe;
|
||||
double _dSet_Zero_Pos;
|
||||
long _lSet_Zero_Pos;
|
||||
} SO7RAXIS;
|
||||
|
||||
struct s_so7_r_axis_config // axis configuration
|
||||
{
|
||||
double _motor_precision;//set precision
|
||||
double _motor_wheelbase;//set wheelbase
|
||||
char _speed_base[5];
|
||||
char _speed_fresh[5];
|
||||
char _speed_start[5];
|
||||
char _speed_max[5];
|
||||
double _speed_slow_dis[5];
|
||||
|
||||
double _MoveToSpeed[2];
|
||||
double _MotionSpeedScale;
|
||||
|
||||
long _scale_range;
|
||||
double _neg_working_limit;
|
||||
double _pos_working_limit;
|
||||
double _scale_resolution;
|
||||
bool _bhomed;
|
||||
};
|
||||
|
||||
struct s_so7_r_machine_interface_config
|
||||
{
|
||||
BOOL _EnCloseLoop;
|
||||
int _RetryTimes;
|
||||
double _ShiftPositionR;
|
||||
char GetInterruptMsgMethod;
|
||||
INT m_WriteDataSleepTime;
|
||||
INT m_AccuraErrPulseR;
|
||||
INT m_EQUIDIS_R;
|
||||
INT m_SDK3000_CntThreadSleepVal;
|
||||
INT m_SV4000E_DenoisePara[4];
|
||||
INT m_MachineType;
|
||||
INT m_VideoCardType;
|
||||
};
|
||||
|
||||
//======================
|
||||
typedef struct s_so7_r
|
||||
{
|
||||
bool bFast;
|
||||
long from;
|
||||
long to;
|
||||
long speed;
|
||||
long acc;
|
||||
long dec;
|
||||
double dFromMM;
|
||||
double dToMM;
|
||||
} SO7RAXISMOVE;
|
||||
//--------------------------------------------------------------------
|
||||
//
|
||||
//--------------------------------------------------------------------
|
||||
struct struct_so7_r_machine
|
||||
{ // g_machine structure
|
||||
struct s_machine_r_config
|
||||
{
|
||||
double _dRSpeed[2];
|
||||
|
||||
struct s_so7_r_axis_config r_axis;
|
||||
struct s_so7_r_machine_interface_config motion;
|
||||
} s_machine_r_config;
|
||||
|
||||
struct s_rstatus
|
||||
{
|
||||
bool _homed;
|
||||
bool _machine_running;
|
||||
bool _bRMoving;
|
||||
char _bIsZMMotionFinished;
|
||||
bool _bRIdle;
|
||||
} s_rstatus;
|
||||
|
||||
char ADC_Number;
|
||||
int ADC_Value;
|
||||
char Sys_Reset_Flag;
|
||||
char cVerNumber;
|
||||
char InterruptFlag[2];
|
||||
char FPGAData;
|
||||
char InPortStatus;
|
||||
int _motor_pulse_num;
|
||||
char FirmwareInfo[10];
|
||||
int FirmwareVer;
|
||||
char GetInterruptMsg[20][2];
|
||||
BOOL IsOffline;
|
||||
BOOL IsSupportReadInterrputMsg;
|
||||
double dRotaryCirclDis;
|
||||
char SEQ_NUMBER;
|
||||
struct s_so7_r_axis r;
|
||||
struct s_so7_r_axis r1;
|
||||
};
|
||||
|
||||
#define SEVENOCEAN_VID 0x4532
|
||||
#define SEVENOCEAN_PID 0x5567
|
||||
//****************************************************************************************************
|
||||
// Binary SevenOcean command structure, out going
|
||||
//
|
||||
//****************************************************************************************************
|
||||
#define pSO7_CMD_02 ((s_SO7_CMD_BUFF_02 *) ep_buff[EP_02_CMD_IDX]._buffer)
|
||||
|
||||
struct s_SO7_R_CMD_BUFF_02
|
||||
{
|
||||
UCHAR uCmdByte;
|
||||
union
|
||||
{
|
||||
struct
|
||||
{
|
||||
BYTE uSubCmdByte;
|
||||
char data[12];
|
||||
}s_SO7_CMD_MOVE_TO_XYZ;
|
||||
struct
|
||||
{
|
||||
BYTE uSubCmdByte;
|
||||
char data[12];
|
||||
}s_SO7_CMD_MOVETOXYZV;
|
||||
struct
|
||||
{
|
||||
BYTE uSubCmdByte;
|
||||
BYTE uStartCmdByte;
|
||||
char _bottom_light;
|
||||
char _top_light;
|
||||
char _ring_light;
|
||||
char _coaxial_light;
|
||||
char _spare_light1;
|
||||
char _outer_ring_light_switch;
|
||||
char _inner_ring_light_switch;
|
||||
BYTE uEndCmdByte;
|
||||
}s_SO7_CMD_SET_LIGHT;
|
||||
};
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
//======================
|
||||
struct struct_so7_r_ep_buff
|
||||
{
|
||||
int _ep;
|
||||
BYTE _save_send_cmd;
|
||||
BYTE _save_send_cmd0;
|
||||
BYTE _save_send_cmd1;
|
||||
char *_buffer; // MAX_BUFF_SIZE
|
||||
int _size;
|
||||
void *_async_context;
|
||||
BOOL _hProtoPending;
|
||||
HANDLE _event;
|
||||
};
|
||||
|
||||
//======================================================================================
|
||||
class CSO7_Proto_Aux
|
||||
{
|
||||
public:
|
||||
// EP 81/82 channel threads.
|
||||
static int g_hEP8x_Thread_State;
|
||||
static unsigned __stdcall g_EP8x_Thread(LPVOID pThis);
|
||||
static HANDLE g_hEP8x_Thread_Id;
|
||||
|
||||
// EP 02channel threads.
|
||||
static int g_hEP02_Thread_State;
|
||||
static unsigned __stdcall g_EP02_Thread(LPVOID pThis);
|
||||
static HANDLE g_hEP02_Thread_Id;
|
||||
static HANDLE g_hEP02_Serial_Mutex; // EP02
|
||||
|
||||
static HANDLE g_hHomedEvent;
|
||||
|
||||
static struct_so7_r_ep_buff ep_buff[lEPSIZE];
|
||||
static struct_so7_r_machine g_machine;
|
||||
|
||||
static CLogger* g_pLogger1;
|
||||
static usb_dev_handle *g_dev;
|
||||
bool m_bHomingActive;
|
||||
|
||||
//
|
||||
CSO7_Proto_Aux();
|
||||
virtual ~CSO7_Proto_Aux();
|
||||
|
||||
// Global Structures
|
||||
SSI_STATUS_MOTION Init_SO7Usb();
|
||||
SSI_STATUS_MOTION Exit_SO7Usb();
|
||||
|
||||
usb_dev_handle* _open_usb_dev(unsigned short sSeqNumber);
|
||||
int Get_R_SeqNumber(usb_dev_handle *udev);
|
||||
SSI_STATUS_MOTION _send_usb_cmd(int iEP_Base);
|
||||
SSI_STATUS_MOTION _write_usb_data_only(int iEP_Base);
|
||||
SSI_STATUS_MOTION _read_data_8x(int iEP_Base);
|
||||
static void _process_rcv_transfer_data(int iEP);
|
||||
SSI_STATUS_MOTION _do_single_threaded_usb_comm(int iEP);
|
||||
|
||||
static SSI_STATUS_MOTION _process_SO7_CMD_READ_AXIS_R();
|
||||
static SSI_STATUS_MOTION _process_SO7_CMD_READ_ZSIGNAL_POS_R();
|
||||
SSI_STATUS_MOTION _send_cmd_SO7_CMD_RESET_R(int iType);
|
||||
SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_R(int iType, int iMoveAngle);
|
||||
SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_AXIS_R();
|
||||
SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_R(int iType);
|
||||
long GetRCurrentPosition(int iType);
|
||||
SSI_STATUS_MOTION _send_cmd_SO7_CMD_STOP_R(int iType);
|
||||
SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_SEQ_NUMBER();
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user