// protocol for control SevenOcean's Machine // ////////////////////////////////////////////////////////////////////// #ifndef AFX_SO7_Proto_H__B422904C_2CEB_495B_B7BD_B45AB30286DD__INCLUDED_ #define AFX_SO7_Proto_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_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 const long MAX_INTENSITY = 0x3FF; #define MAXLIGHTVALUE 255 #define MINLIGHTVALUE 1 enum EMACHINETYPE { MACHINE_SO7_CONTROLLER, MACHINE_METRONICS_CONTROLLER, MACHINE_TOTAL=255 }; enum EFirmwareVer { FirmwareVer_3_X=0, FirmwareVer_6_X, FirmwareVer_Total }; #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_axis // axis parameters { char _Move_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; } SO7AXIS; struct s_so7_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_zm_axis_config // zm configuration { int _ComPort; double _StartDegree; double _EndDegree; double _RelativeZeroDegree; double _Deadband; int _ReadingInterval; double _PulseScale; short _SpeedFast; short _SpeedSlow; CString _ProductID; long _neg_working_limit; long _pos_working_limit; double _neg_deg_working_limit; // within the limits double _pos_deg_working_limit; union { short _short_; char _char_[2]; }_speed; }; struct s_so7_machine_interface_config { BOOL _EnCloseLoop; int _RetryTimes; double _ShiftPositionX; double _ShiftPositionY; double _ShiftPositionZ; INT m_CntThreadSleepVal; char GetInterruptMsgMethod; INT m_WriteDataSleepTime; INT m_AccuraErrPulseX; INT m_AccuraErrPulseY; INT m_AccuraErrPulseZ; INT m_EQUIDIS_X; INT m_EQUIDIS_Y; INT m_EQUIDIS_Z; INT m_MachineType; INT m_VideoCardType; }; //====================== typedef struct s_so7_xyzzm { bool bFast; long from; long to; long speed; long acc; long dec; double dFromMM; double dToMM; } SO7AXISMOVE; //-------------------------------------------------------------------- // //-------------------------------------------------------------------- struct struct_so7_machine { // g_machine structure struct s_machine_config { double _dXYZSpeed; struct s_so7_axis_config x_axis; struct s_so7_axis_config y_axis; struct s_so7_axis_config z_axis; struct s_so7_zm_axis_config zm_axis; struct s_so7_machine_interface_config motion; } s_machine_config; struct s_status { bool _homed; bool _machine_running; bool _bXMoving; bool _bYMoving; bool _bZMoving; bool _bZMMoving; char _bIsZMMotionFinished; bool _bZMHoming; bool _bXYZZMIdle; } s_status; union { struct s_lights_value { char _top_light; char _bottom_light; char _ring_light; char _coaxial_light; char _spare_light1; char segment[TWO_RINGS]; } s_lights_value; }; char cFixtureFlag; char Light_Size; char Light_Switch; 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; struct s_so7_axis x; struct s_so7_axis y; struct s_so7_axis z; struct s_so7_axis zm; }; #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_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_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 { 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; // CSO7_Proto(); virtual ~CSO7_Proto(); // Global Structures static struct_so7_ep_buff ep_buff[lEPSIZE]; static struct_so7_machine g_machine; SSI_STATUS_MOTION Init_SO7Usb(); SSI_STATUS_MOTION Exit_SO7Usb(); usb_dev_handle* _open_usb_dev(void); SSI_STATUS_MOTION _do_single_threaded_usb_comm(int iEP); SSI_STATUS_MOTION _read_data_8x(int iEP_Base); SSI_STATUS_MOTION _send_usb_cmd(int iEP_Base); SSI_STATUS_MOTION _write_usb_data_only(int iEP_Base); static void _process_rcv_transfer_data(int iEP); static double TimeInSecs(void); static CLogger* g_pLogger; static usb_dev_handle *g_dev; bool m_bHomingActive; double ScaleToMM(long lCount, double dResolution); long MMtoScale(double lDistanceMM, double dResolution); static void Trace_EP_Buff(long lIndex); static void _swap_byte(unsigned short &Val); static void _reverse_dword(DWORD *); static void _scale2inch(unsigned long scale, double &inch); static void _inch2scale(unsigned long &scale, double inch); static long _4char2long(unsigned char *cBuff); static long _3char2long(unsigned char *cBuff); static void _char2bin(unsigned char *cBuff, BYTE *cBytes, int len); SSI_STATUS_MOTION _replay_capture(CString cFileName); SSI_STATUS_MOTION _process_replay_capture_commands(char *inBuff, FILE* pInFile); SSI_STATUS_MOTION Load_SevenOcean_Inifile(CString csSO7INIFile); SSI_STATUS_MOTION Save_SevenOcean_Inifile(CString csSO7INIFile); SSI_STATUS_MOTION Load_So7_Config(); SSI_STATUS_MOTION Save_So7_Config(); SSI_STATUS_MOTION GetAppPath(CString &Path); SSI_STATUS_MOTION ExtractAppPath(CString &Path); SSI_STATUS_MOTION so7_motion_startup(double x_scale_resolution, double y_scale_resolution, double z_scale_resolution); bool so7_motion_is_homed(); SSI_STATUS_MOTION so7_motion_Dcc_Home(); SSI_STATUS_MOTION _start_machine(); SSI_STATUS_MOTION _shutdown_machine(); SSI_STATUS_MOTION so7_motion_probe_on_off_(bool _bOnOff); SSI_STATUS_MOTION so7_motion_reset_worktable_lower_left(char _HomeMode); SSI_STATUS_MOTION so7_motion_reset_worktable_top_right(); SSI_STATUS_MOTION so7_motion_stop_motor_to_get_laser_data(); SSI_STATUS_MOTION so7_motion_laser_on_off(bool _bOnOff); SSI_STATUS_MOTION so7_motion_fixture_on_off(bool _bOnOff); SSI_STATUS_MOTION so7_motion_fixture_up_down(bool _bOnOff); SSI_STATUS_MOTION so7_motion_reset_controller_parameter(); SSI_STATUS_MOTION _get_xyz_index(long & lX, long & lY, long & lZ); SSI_STATUS_MOTION so7_motion_get_position_xyz(double & dX, double & dY, double & dZ); SSI_STATUS_MOTION so7_motion_set_position_xyz(double dX, double dY, double dZ, bool bWait); SSI_STATUS_MOTION so7_motion_set_speed_xyz(double dPercentSpeed); SSI_STATUS_MOTION so7_motion_get_speed_xyz(double &dPercentSpeed); SSI_STATUS_MOTION so7_motion_get_3D_max_speed(double &dMaxSpeed); SSI_STATUS_MOTION so7_motion_is_finished(char MotionType,BOOL& IsFinished); SSI_STATUS_MOTION _calculate_straightline_motion(double dSpeedMM); SSI_STATUS_MOTION so7_optics_set_scale_position(long lScale); SSI_STATUS_MOTION so7_optics_get_scale_position(long &lScale); SSI_STATUS_MOTION so7_optics_get_scale_range(long &neg_scale_range, long &pos_scale_range); void so7_set_full_ringlight_data(long lIntensity); void so7_set_ringlight_data(long lMaxSize, double *pSegments); SSI_STATUS_MOTION so7_light_set_light_off(); SSI_STATUS_MOTION so7_light_set_light(); SSI_STATUS_MOTION so7_light_set_lamp_state(double dBottomPercent, double dTopPercent); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_X(char SpeedGear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_Y(char SpeedGear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_Z(char SpeedGear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_ZM(char SpeedGear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_STOP_MOVE_XYZ(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_RESET_XYZ(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_RESET_V(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_STOP_V(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_TO_POS_X(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_TO_POS_Y(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_TO_POS_Z(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_TO_POS_ZM(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_TO_POS_XYZ(char ProbeType); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_TO_POS_XYZV(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_AXIS_XYZ(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_PROBE_XYZ(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_V_DATA(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_GET_RESET_FLAG(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_GET_FIXTURE_VALUE(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_RESET_FLAG(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_LIGHT_SIZE(char subCMD,BYTE LightValue); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_ALL_LIGHT_VALUE(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_VER_NUMBER(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_CORRECTION_SCALE(char cAxisType); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_SECTION(char cAxisType); SSI_STATUS_MOTION _send_cmd_SO7_CMD_COMMON_COMMAND(char Cmd,char SubCmd,char Type); SSI_STATUS_MOTION _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(char Cmd,char SubCmd,char Type,char Data); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_ZOOM_SPEED(char xyz_gear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_SPEED_PARAMETER(char axis_type,char xyz_gear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_SPEED_PRECISION(char axis_type); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_SPEED_PARAMETER(char axis_type,char xyz_gear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_MOTOR_SPEED_WHEELBASE_PARAMETER(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_MOTOR_SPEED_WHEELBASE_PARAMETER(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_SPEED_PRECISION(char axis_type); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_INTERRUPT_MESSAGE(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_ZOOM_MOTION_STATUS(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_OPEN_KEYENCE_LASER(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_INPUT_PORT_STATUS(char AddrType); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_X(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_Y(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_ZSIGNAL_POS_Z(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_WRITE_DATA_TO_FPGA(char axis_type,char Addr,char Data); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(char axis_type,char Addr); SSI_STATUS_MOTION _send_cmd_SO7_CMD_READ_FIRMWARE_VERSION_INFO(); SSI_STATUS_MOTION _send_cmd_SO7_CMD_GET_INTERRUPT_MSG(char cType); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_INTERRUPT_MSG(char cType,char cValue); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_GET_INTERRUPT_MSG_METHOD(char Method); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_XY(char SpeedGearX,char SpeedGearY); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_CONSTANT_SPEED(int iSpeed,char axis_type,char xyz_gear); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_X(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_Y(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_Z(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_ZM(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_RESET_XYZ(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_TO_POS_X(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_TO_POS_Y(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_TO_POS_Z(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_TO_POS_ZM(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_TO_POS_XYZ(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_AXIS_XYZ(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_PROBE_XYZ(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_V_DATA(); static SSI_STATUS_MOTION _process_SO7_CMD_GET_GET_RESET_FLAG(); static SSI_STATUS_MOTION _process_SO7_CMD_GET_GET_FIXTURE_VALUE(); static SSI_STATUS_MOTION _process_SO7_CMD_SET_LIGHT(); static SSI_STATUS_MOTION _process_SO7_CMD_SET_SPEED_PARAMETER(); static SSI_STATUS_MOTION _process_SO7_CMD_SET_SPEED_PRECISION(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_SPEED_PARAMETERX(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_SPEED_PARAMETERY(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_SPEED_PARAMETERZ(); static SSI_STATUS_MOTION _process_SO7_CMD_SET_SPEED_MOTOR_WHEELBASE_PARAMETER(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_MOTOR_SPEED_WHEELBASE_PARAMETER(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_SPEED_PRECISIONX(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_SPEED_PRECISIONY(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_SPEED_PRECISIONZ(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_INTERRUPT_MESSAGE(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_ZOOM_MOTION_STATUS(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_INPUT_PORT_STATUS(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_ZSIGNAL_POS_X(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_ZSIGNAL_POS_Y(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_ZSIGNAL_POS_Z(); static SSI_STATUS_MOTION _process_SO7_CMD_WRITE_DATA_TO_FPGA(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_DATA_FROM_FPGA(); static SSI_STATUS_MOTION _process_SO7_CMD_READ_FIRMWARE_VERSION_INFO(); static SSI_STATUS_MOTION _process_SO7_CMD_GET_INTERRUPT_MSG(BYTE Type); }; #endif