From ae262c9015ea4cf7ebcbc0ae4b577c45220ea948 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Thu, 24 Jul 2014 18:19:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9EX=E3=80=81Y=E3=80=81Z?= =?UTF-8?q?=E8=BD=B4=E8=BF=90=E5=8A=A8=E6=A8=A1=E5=BC=8F=E5=8F=AF=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E5=BC=80=E7=8E=AF=E6=88=96=E9=97=AD=E7=8E=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h | 8 ++ .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp | 75 +++++++++++++++++- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h | 5 +- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 5 ++ .../Tools/UsbUtility/Debug/Utility_Config.ini | 46 +++++------ .../UsbUtility/UsbUtil/SO7_Send_Parameter.cpp | 2 +- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 53 +++++++++---- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 150016 -> 150016 bytes 8 files changed, 150 insertions(+), 44 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h index 82ca187..c66ee15 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h @@ -360,6 +360,14 @@ enum PRO_DATA CT_SET_TRIG_SAMPLE_CNT, CT_GET_TRIG_SAMPLE_CNT, + + CT_READ_X_CONTROL_MODE, + CT_WRITE_X_CONTROL_MODE, + CT_READ_Y_CONTROL_MODE, + CT_WRITE_Y_CONTROL_MODE, + CT_READ_Z_CONTROL_MODE, + CT_WRITE_Z_CONTROL_MODE, + CT_DATA_TOTAL=255 }; enum EHOME_MODE diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp index 7825c36..12d465b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp @@ -254,7 +254,11 @@ void CSO7_Proto::_process_rcv_transfer_data(int iEP) case CT_WRITE_TRIG_PULSE_PARA: _process_SO7_CMD_WRITE_TRIG_PULSE_PARA(); break; - + case CT_READ_X_CONTROL_MODE: + case CT_READ_Y_CONTROL_MODE: + case CT_READ_Z_CONTROL_MODE: + _process_SO7_CMD_GET_CONTROL_MODE(); + 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]); @@ -6349,6 +6353,69 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_GET_MOTION_CNTS(char _Speedgear) return SSI_STATUS_MOTION_NORMAL; } //============================================================== +SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_SET_CONTROL_MODE(char axis_type,char ControlMode) +{ + 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; + char cCMD(0); + if(axis_type==E_AXIS_X) + { + cCMD=CT_WRITE_X_CONTROL_MODE; + } + else if(axis_type==E_AXIS_Y) + { + cCMD=CT_WRITE_Y_CONTROL_MODE; + } + else + { + cCMD=CT_WRITE_Z_CONTROL_MODE; + } + *(ep_buff[EP_02_CMD_IDX]._buffer+1) = cCMD; + *(ep_buff[EP_02_CMD_IDX]._buffer+2)= ControlMode; + + ep_buff[EP_02_CMD_IDX]._size = 0x05; + ep_buff[EP_81_DATA_IDX]._size = 0x00; + + 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::_send_cmd_SO7_CMD_GET_CONTROL_MODE(char axis_type) +{ + 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; + char cCMD(0); + if(axis_type==E_AXIS_X) + { + cCMD=CT_READ_X_CONTROL_MODE; + } + else if(axis_type==E_AXIS_Y) + { + cCMD=CT_READ_Y_CONTROL_MODE; + } + else + { + cCMD=CT_READ_Z_CONTROL_MODE; + } + + *(ep_buff[EP_02_CMD_IDX]._buffer+1) = cCMD; + + ep_buff[EP_02_CMD_IDX]._size = 0x02; + ep_buff[EP_82_DATA_IDX]._size = 0x01; + + 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::_process_SO7_CMD_MOVE_X() { @@ -6764,3 +6831,9 @@ SSI_STATUS_MOTION CSO7_Proto::_process_SO7_CMD_GET_MOTION_CNTS() g_machine.Arm_MotionStopCnts[index]=*(ep_buff[EP_82_DATA_IDX]._buffer+2); return SSI_STATUS_MOTION_NORMAL; } +//============================================================== +SSI_STATUS_MOTION CSO7_Proto::_process_SO7_CMD_GET_CONTROL_MODE() +{ + g_machine.FPGAData = *(ep_buff[EP_82_DATA_IDX]._buffer); + return SSI_STATUS_MOTION_NORMAL; +} \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h index 8213029..e981b7b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h @@ -574,7 +574,8 @@ public: SSI_STATUS_MOTION _send_cmd_SO7_CMD_IO_PURPOSE(BOOL _bEnTrigIO); SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_MOTION_CNTS(char _Speedgear,char _StartCnts,char _StopCnts); SSI_STATUS_MOTION _send_cmd_SO7_CMD_GET_MOTION_CNTS(char _Speedgear=0); - + SSI_STATUS_MOTION _send_cmd_SO7_CMD_SET_CONTROL_MODE(char axis_type,char ControlMode); + SSI_STATUS_MOTION _send_cmd_SO7_CMD_GET_CONTROL_MODE(char axis_type); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_X(); static SSI_STATUS_MOTION _process_SO7_CMD_MOVE_Y(); @@ -616,7 +617,7 @@ public: static SSI_STATUS_MOTION _process_SO7_CMD_READ_TRIG_PULSE_PARA(); static SSI_STATUS_MOTION _process_SO7_CMD_WRITE_TRIG_PULSE_PARA(); static SSI_STATUS_MOTION _process_SO7_CMD_GET_MOTION_CNTS(); - + static SSI_STATUS_MOTION _process_SO7_CMD_GET_CONTROL_MODE(); }; #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index a8ca501..9b32ff4 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -4750,3 +4750,8 @@ Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. +Usb Port Initialized. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini index da5e420..8375494 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/Utility_Config.ini @@ -11,41 +11,41 @@ MOVETOSPEED_FAST_Z=0.00000000 MOVETOSPEED_SLOW_Z=0.00000000 MOVETOSPEED_SCALE_Z=1.00000000 ; -SPEED_BASE_X1=50 +SPEED_BASE_X1=28 SPEED_MAX_X1=30 SPEED_START_X1=20 -SPEED_FRESH_X1=7 -SPEED_SLOW_X1=3.500 +SPEED_FRESH_X1=8 +SPEED_SLOW_X1=3.000 ; SPEED_BASE_X2=16 SPEED_MAX_X2=10 SPEED_START_X2=12 SPEED_FRESH_X2=10 -SPEED_SLOW_X2=0.100 +SPEED_SLOW_X2=2.000 ; SPEED_BASE_X3=2 SPEED_MAX_X3=0 SPEED_START_X3=0 -SPEED_FRESH_X3=10 +SPEED_FRESH_X3=100 SPEED_SLOW_X3=0.001 ; SPEED_BASE_X4=2 SPEED_MAX_X4=0 SPEED_START_X4=5 -SPEED_FRESH_X4=10 +SPEED_FRESH_X4=100 SPEED_SLOW_X4=0.001 ; SPEED_BASE_X5=2 SPEED_MAX_X5=0 SPEED_START_X5=50 -SPEED_FRESH_X5=10 +SPEED_FRESH_X5=100 SPEED_SLOW_X5=0.000 ; -SPEED_BASE_Y1=60 +SPEED_BASE_Y1=20 SPEED_MAX_Y1=10 SPEED_START_Y1=20 SPEED_FRESH_Y1=8 -SPEED_SLOW_Y1=3.000 +SPEED_SLOW_Y1=2.000 ; SPEED_BASE_Y2=16 SPEED_MAX_Y2=10 @@ -56,20 +56,20 @@ SPEED_SLOW_Y2=1.000 SPEED_BASE_Y3=2 SPEED_MAX_Y3=0 SPEED_START_Y3=0 -SPEED_FRESH_Y3=10 +SPEED_FRESH_Y3=100 SPEED_SLOW_Y3=0.001 ; SPEED_BASE_Y4=2 SPEED_MAX_Y4=0 SPEED_START_Y4=10 -SPEED_FRESH_Y4=10 +SPEED_FRESH_Y4=100 SPEED_SLOW_Y4=0.001 ; -SPEED_BASE_Y5=60 -SPEED_MAX_Y5=10 -SPEED_START_Y5=20 -SPEED_FRESH_Y5=8 -SPEED_SLOW_Y5=3.000 +SPEED_BASE_Y5=2 +SPEED_MAX_Y5=0 +SPEED_START_Y5=50 +SPEED_FRESH_Y5=100 +SPEED_SLOW_Y5=0.000 ; SPEED_BASE_Z1=20 SPEED_MAX_Z1=100 @@ -86,28 +86,28 @@ SPEED_SLOW_Z2=1.500 SPEED_BASE_Z3=3 SPEED_MAX_Z3=5 SPEED_START_Z3=5 -SPEED_FRESH_Z3=10 +SPEED_FRESH_Z3=100 SPEED_SLOW_Z3=0.001 ; SPEED_BASE_Z4=2 SPEED_MAX_Z4=0 SPEED_START_Z4=18 -SPEED_FRESH_Z4=10 +SPEED_FRESH_Z4=100 SPEED_SLOW_Z4=0.001 ; SPEED_BASE_Z5=2 SPEED_MAX_Z5=6 SPEED_START_Z5=133 -SPEED_FRESH_Z5=10 +SPEED_FRESH_Z5=100 SPEED_SLOW_Z5=0.000 ; X_MOTOR_PRECISION=0.008 -Y_MOTOR_PRECISION=0.004 +Y_MOTOR_PRECISION=0.009 Z_MOTOR_PRECISION=0.004 ; -X_MOTOR_WHEELBASE=3.047 -Y_MOTOR_WHEELBASE=2.971 -Z_MOTOR_WHEELBASE=1.500 +X_MOTOR_WHEELBASE=1.875 +Y_MOTOR_WHEELBASE=1.875 +Z_MOTOR_WHEELBASE=1.000 ; MOTOR_PULSE_NUM=10000 ; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp index 99a66d5..be3a821 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp @@ -218,7 +218,7 @@ BOOL CSO7_Send_Parameter::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_CANVAS_SPEED_TIME))->SetCheck(true); if (m_pSO7_Proto->g_machine.FirmwareVer>=FirmwareVer_6_X) { - ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA1))->SetWindowTextW(_T("加速度(0-255)")); + ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA1))->SetWindowTextW(_T("加减速度(0-255)")); ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA2))->SetWindowTextW(_T("缓冲距离(0-255)")); ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA3))->SetWindowTextW(_T("最低速率(0-255)")); ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA4))->SetWindowTextW(_T("刷新周期(0-255)")); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp index cd69592..6d4d0a1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp @@ -191,7 +191,7 @@ BOOL CSO7_UtilDlg::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_READ_OUTPUT_PORT2))->SetCheck(false); m_ReadIOStatusAddr=ESO7_CONTROLLER_LIMIT_SWITCH_ADDR; UpdateIOAddrCaption(); - + CString csTmp=_T(""); ((CComboBox *)GetDlgItem(IDC_COMBO_OUTPORT_NUMBER))->ResetContent(); int iComboxIndex(0); @@ -210,38 +210,42 @@ BOOL CSO7_UtilDlg::OnInitDialog() ((CComboBox *)GetDlgItem(IDC_COMBO_OUTPORT_NUMBER))->SetCurSel(0); ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->ResetContent(); - for(int i=0;i<16;i++) + int nIndex=0; + for( nIndex=0;nIndex<16;nIndex++) { - if (i==9) + if (nIndex==9) { csTmp=_T("Flags"); } - else if (i==10) + else if (nIndex==10) { csTmp=_T("TrigLSB"); } - else if (i==11) + else if (nIndex==11) { csTmp=_T("AccErr"); } - else if (i==12) + else if (nIndex==12) { csTmp=_T("TrigMSBI"); } - else if (i==13) + else if (nIndex==13) { csTmp=_T("TrigMSBII"); } - else if (i==14) + else if (nIndex==14) { csTmp=_T("TrigHoldTime"); } else { - csTmp.Format(_T("%d"),i); + csTmp.Format(_T("%d"),nIndex); } - ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->InsertString(i,csTmp); + ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->InsertString(nIndex,csTmp); } + csTmp=_T("ControlMode"); + ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->InsertString(nIndex,csTmp); + ((CComboBox *)GetDlgItem(IDC_COMBO_RWDATA_ADDR))->SetCurSel(10); GetDlgItem(IDC_EDIT_RWDATA_DATA)->SetWindowTextW(_T("0")); @@ -347,7 +351,7 @@ void CSO7_UtilDlg::UpdateCtrlsStatus(bool _bEnable) GetDlgItem(IDC_CHECK_CONTINUOUS_READ_IO_STATUS)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_TEST_Z_SIGNAL)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_S07_SET_IO_PURPOSE)->EnableWindow(_bEnable); - + GetDlgItem(IDC_EDIT_SET_VER_NO)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_CNC_PROGRAM)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_SENDDATATOFPGA)->EnableWindow(_bEnable); @@ -360,14 +364,14 @@ void CSO7_UtilDlg::UpdateCtrlsStatus(bool _bEnable) GetDlgItem(IDC_CHECK_SO7_RING_LIGHT_SEG_ON2)->EnableWindow(_bEnable); GetDlgItem(IDC_CHECK_SO7_COAXIAL_LIGHT_ON)->EnableWindow(_bEnable); GetDlgItem(IDC_CHECK_SO7_SPARE_LIGHT_ON)->EnableWindow(_bEnable); - + GetDlgItem(IDC_BUTTON_SO7_EXTERNAL_TRIG)->EnableWindow(_bEnable); GetDlgItem(IDC_EDIT_SET_SEQ_NO)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_GET_SEQ_NUMBER)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_SET_SEQ_NUMBER)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SO7_SET_VER_NUMBER)->EnableWindow(_bEnable); GetDlgItem(IDC_BUTTON_SET_SCALE_COEFFICIENT)->EnableWindow(_bEnable); - + } //===================================================================== @@ -421,7 +425,7 @@ void CSO7_UtilDlg::OnBnClickedButtonStartSo7machine() OnBnClickedButtonInitSo7usb(); if(XBoxPlayer->IsConnected()) { - XBoxPlayer->XBoxControllerInit(); + XBoxPlayer->XBoxControllerInit(); m_OutMessage=_T("XBoxController has connected."); OutputWithScroll(m_OutMessage,m_edMSG); } @@ -437,7 +441,7 @@ void CSO7_UtilDlg::OnBnClickedButtonStartSo7machine() if(m_pSO7_Proto->g_machine.IsSupportReadInterrputMsg) { m_pSO7_Proto->_send_cmd_SO7_CMD_READ_FIRMWARE_VERSION_INFO(); - + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(E_AXIS_V,9); char cData[2]={0}; cData[0]=(m_pSO7_Proto->g_machine.FPGAData>>4)&0x0f; @@ -1197,7 +1201,15 @@ void CSO7_UtilDlg::OnBnClickedButtonSo7Senddatatofpga() GetDlgItem(IDC_EDIT_RWDATA_DATA)->GetWindowText(str); const char* cTempValue=T2A(str); char cTmpData= static_cast(atoi(cTempValue)); - m_pSO7_Proto->_send_cmd_SO7_CMD_WRITE_DATA_TO_FPGA(m_RWDataAxis,m_RWDataAddr,cTmpData); + if(m_RWDataAddr==16) + { + m_pSO7_Proto->_send_cmd_SO7_CMD_SET_CONTROL_MODE(m_RWDataAxis,cTmpData); + m_pSO7_Proto->g_machine.FPGAData=1; + } + else + { + m_pSO7_Proto->_send_cmd_SO7_CMD_WRITE_DATA_TO_FPGA(m_RWDataAxis,m_RWDataAddr,cTmpData); + } if (m_pSO7_Proto->g_machine.FPGAData>0) { m_OutMessage=_T("Write data successful."); @@ -1213,7 +1225,14 @@ void CSO7_UtilDlg::OnBnClickedButtonSo7Senddatatofpga() //================================================================================================ void CSO7_UtilDlg::OnBnClickedButtonSo7Readdatafromfpga() { - m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(m_RWDataAxis,m_RWDataAddr); + if(m_RWDataAddr==16) + { + m_pSO7_Proto->_send_cmd_SO7_CMD_GET_CONTROL_MODE(m_RWDataAxis); + } + else + { + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_DATA_FROM_FPGA(m_RWDataAxis,m_RWDataAddr); + } m_OutMessage.Format(_T("[Read]Data=%d ."),(BYTE)m_pSO7_Proto->g_machine.FPGAData); OutputWithScroll(m_OutMessage,m_edMSG); } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 2685430374648cf53310cd200c84cc68ed39c9bf..22f31e3c57a6c5d98a4d9b9acbb6fd92f543185d 100644 GIT binary patch delta 2375 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