修改好速度档位不能正常切换的问题。

This commit is contained in:
TAO Cheng
2014-03-10 17:55:59 +08:00
parent 684c0c9761
commit ad05ad7437
9 changed files with 396 additions and 118 deletions
@@ -3962,3 +3962,201 @@ Init:Open device succeed .
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Destruct Cso7_Proto.
Construct Cso7_Proto.
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Init:Open device succeed .
@@ -15,13 +15,13 @@ SPEED_BASE_X1=20
SPEED_MAX_X1=20
SPEED_START_X1=20
SPEED_FRESH_X1=8
SPEED_SLOW_X1=3.299
SPEED_SLOW_X1=2.000
;
SPEED_BASE_X2=16
SPEED_MAX_X2=10
SPEED_START_X2=12
SPEED_FRESH_X2=10
SPEED_SLOW_X2=2.000
SPEED_SLOW_X2=1.000
;
SPEED_BASE_X3=2
SPEED_MAX_X3=0
@@ -443,13 +443,8 @@ void CSO7_UtilDlg::OnBnClickedButtonStartSo7machine()
//=====================================================================
void CSO7_UtilDlg::OnBnClickedButtonStopSo7machine()
{
if(XBoxPlayer->IsConnected())
{
XBoxPlayer->XBoxControllerExit();
}
{
XBoxPlayer->XBoxControllerExit();
CString csPath;
m_pSO7_Proto->GetAppPath(csPath);
m_pSO7_Proto->Save_SevenOcean_Inifile(csPath+_T("\\Utility_Config.ini"));
@@ -173,11 +173,11 @@ void CSo7_Option::OnBnClickedOk()
{
XBoxPlayer = new CXBOXController(1);
}
CSO7_UtilDlg* pSO7_UtilDlg=new CSO7_UtilDlg();
pSO7_UtilDlg->DoModal();
delete pSO7_UtilDlg;
if (XBoxPlayer)
{
delete XBoxPlayer;
@@ -4,10 +4,10 @@
#include "So7_XBoxController.h"
#define M_PI 3.14159265358979323846
const double XBOX_X_ANGLE=(M_PI / 180.0 * 10.0);
const double XBOX_Y_ANGLE=(M_PI / 180.0 * 80.0);
const double XBOX_XY_ANGLE_BEGIN=(M_PI / 180.0 * 35.0);
const double XBOX_XY_ANGLE_END=(M_PI / 180.0 * 55.0);
const double XBOX_X_ANGLE=(M_PI / 180.0 * 18.0);
const double XBOX_Y_ANGLE=(M_PI / 180.0 * 72.0);
const double XBOX_XY_ANGLE_BEGIN=(M_PI / 180.0 * 20.0);
const double XBOX_XY_ANGLE_END=(M_PI / 180.0 * 70.0);
extern CSO7_Proto* m_pSO7_Proto;
@@ -15,21 +15,19 @@ HANDLE CXBOXController::XBoxhThread = NULL;
HANDLE CXBOXController::XBoxThreadMutex = NULL;
HANDLE CXBOXController::XBoxhTriggerEvent;
int CXBOXController::XBoxThreadState = XBTHREAD_PAUSED;
bool CXBOXController::XYWAITSTOP = false;
bool CXBOXController::ZWAITSTOP = false;
static short LX = 0, LY = 0, RX = 0, RY = 0;
static WORD wBtns = 0;
static BYTE TopLightValue = 0;
static BYTE BottomLightValue = 0;
static int TopLightBtnDown = 0;
static int BottomLightBtnDown = 0;
static char MoveSpeedGear[3]={0};
static short LX(0), LY(0), RX(0), RY(0);
static WORD wBtns(0);
static BYTE TopLightValue(0);
static BYTE BottomLightValue(0);
static int TopLightBtnDown(0);
static int BottomLightBtnDown(0);
static INT m_MoveXYZType(0);
static INT m_MoveSpeedGear[3]={0};
CXBOXController::CXBOXController(int playerNumber)
{
m_ControllerNum = playerNumber - 1;
m_IsConnected=false;
}
CXBOXController::~CXBOXController()
@@ -78,6 +76,7 @@ void CXBOXController::XBoxControllerExit(void)
bool CXBOXController::IsConnected()
{
m_IsConnected=false;
ZeroMemory(&m_ControllerState, sizeof(XINPUT_STATE));
DWORD Result = XInputGetState(m_ControllerNum, &m_ControllerState);
if (Result == ERROR_SUCCESS)
@@ -108,114 +107,184 @@ void CXBOXController::Vibrate(int leftVal, int rightVal)
XInputSetState(m_ControllerNum, &Vibration);
}
bool CXBOXController::MoveXYZ(int _EMoveType,INT* _SpeedGear)
{
bool rStatus(true);
bool IsSameType(false);
if (m_MoveXYZType==_EMoveType)
{
rStatus=false;
IsSameType=true;
}
switch(_EMoveType)
{
case E_XBOX_STOPXYZ:
{
if (!IsSameType)
{
m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ();
}
break;
}
case E_XBOX_MOVE_XL:
case E_XBOX_MOVE_XR:
{
if (_SpeedGear[0]!=m_MoveSpeedGear[0])
{
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(static_cast<char>(_SpeedGear[0]));
m_MoveSpeedGear[0]=_SpeedGear[0];
}
break;
}
case E_XBOX_MOVE_YB:
case E_XBOX_MOVE_YF:
{
if (_SpeedGear[1]!=m_MoveSpeedGear[1])
{
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Y(static_cast<char>(_SpeedGear[1]));
m_MoveSpeedGear[1]=_SpeedGear[1];
}
break;
}
case E_XBOX_MOVE_ZU:
case E_XBOX_MOVE_ZD:
{
if (_SpeedGear[2]!=m_MoveSpeedGear[2])
{
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Z(static_cast<char>(_SpeedGear[2]));
m_MoveSpeedGear[2]=_SpeedGear[2];
}
break;
}
case E_XBOX_MOVE_XLYB:
case E_XBOX_MOVE_XLYF:
case E_XBOX_MOVE_XRYB:
case E_XBOX_MOVE_XRYF:
{
if ((_SpeedGear[0]!=m_MoveSpeedGear[0]) || (_SpeedGear[1]!=m_MoveSpeedGear[1]))
{
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(static_cast<char>(_SpeedGear[0]),static_cast<char>(_SpeedGear[1]));
m_MoveSpeedGear[0]=_SpeedGear[0];
m_MoveSpeedGear[1]=_SpeedGear[1];
}
break;
}
default:
{
break;
}
}
m_MoveXYZType=_EMoveType;
return rStatus;
}
unsigned __stdcall CXBOXController::g_XBox_Thread(LPVOID pThis)
{
CXBOXController* _This = (CXBOXController*)pThis;
bool bXYWAITSTOP(false);
bool bZWAITSTOP(false);
INT MoveSpeedGear[3]={0};
for (;;)
{
if(XBoxThreadState == XBTHREAD_EXIT)
{
ExitThread(0);
}
LX = _This->GetState().Gamepad.sThumbLX;
LY = _This->GetState().Gamepad.sThumbLY;
RX = _This->GetState().Gamepad.sThumbRX;
RY = _This->GetState().Gamepad.sThumbRY;
wBtns = _This->GetState().Gamepad.wButtons;
//TRACE2("[XBOX]LX:%d LY:%d\n",LX,LY);
//TRACE2("[XBOX]RX:%d RY:%d\n",RX,RY);
//TRACE2("[XBOX]LX:%d LY:%d\n",static_cast<int>(LX),static_cast<int>(LY));
//TRACE2("[XBOX]RX:%d RY:%d\n",static_cast<int>(RX),static_cast<int>(RY));
//Z Direction
if(LY>128 && abs(LX)<LY/tan(XBOX_Y_ANGLE))
{
MoveSpeedGear[2]=static_cast<char>((LY - 128) / 8160 + 1);
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Z(MoveSpeedGear[2]);
ZWAITSTOP = true;
MoveSpeedGear[0]=0;
MoveSpeedGear[1]=0;
MoveSpeedGear[2]=static_cast<INT>((LY - 128) / 8160 + 1);
_This->MoveXYZ(E_XBOX_MOVE_ZU,MoveSpeedGear);
bZWAITSTOP=true;
}
else if(LY<128 && abs(LX)<-LY/tan(XBOX_Y_ANGLE))
else if(LY<-128 && abs(LX)<-LY/tan(XBOX_Y_ANGLE))
{
MoveSpeedGear[2]=static_cast<char>((LY + 128) / 8160.25 - 1);
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Z(MoveSpeedGear[2]);
ZWAITSTOP = true;
MoveSpeedGear[0]=0;
MoveSpeedGear[1]=0;
MoveSpeedGear[2]=static_cast<INT>((LY + 128) / 8160.25 - 1);
_This->MoveXYZ(E_XBOX_MOVE_ZD,MoveSpeedGear);
bZWAITSTOP=true;
}
else if(ZWAITSTOP)
else if(bZWAITSTOP)
{
m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ();
ZWAITSTOP = false;
_This->MoveXYZ(E_XBOX_STOPXYZ,MoveSpeedGear);
bZWAITSTOP=false;
}
//XY Direction
if(RX<128 && abs(RY)<-RX*tan(XBOX_X_ANGLE))
if(RX<-128 && abs(RY)<-RX*tan(XBOX_X_ANGLE))
{
MoveSpeedGear[0]=static_cast<char>((RX + 128) / 8160.25 - 1);
MoveSpeedGear[0]=3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(MoveSpeedGear[0]);
XYWAITSTOP = true;
}
else if(RX<128 && RY>-RX*tan(XBOX_XY_ANGLE_BEGIN) && RY<-RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<char>((RX + 128) / 8160.25 - 1);
MoveSpeedGear[1]=static_cast<char>((RY - 128) / 8160 + 1);
MoveSpeedGear[0]=3;
MoveSpeedGear[1]=-3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]);
XYWAITSTOP = true;
}
else if(RY>128 && abs(RX)<RY/tan(XBOX_Y_ANGLE))
{
MoveSpeedGear[1]=static_cast<char>((RY - 128) / 8160 + 1);
MoveSpeedGear[1]=-3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Y(MoveSpeedGear[1]);
XYWAITSTOP = true;
}
else if(RX>128 && RY>RX*tan(XBOX_XY_ANGLE_BEGIN) && RY<RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<char>((RX - 128) / 8160 + 1);
MoveSpeedGear[1]=static_cast<char>((RY - 128) / 8160 +1);
MoveSpeedGear[0]=-3;
MoveSpeedGear[1]=-3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]);
XYWAITSTOP = true;
MoveSpeedGear[0]=static_cast<INT>((RX + 128) / 8160.25 - 1);
MoveSpeedGear[1]=0;
_This->MoveXYZ(E_XBOX_MOVE_XR,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RX>128 && abs(RY)<RX*tan(XBOX_X_ANGLE))
{
MoveSpeedGear[0]=static_cast<char>((RX - 128) / 8160 + 1);
MoveSpeedGear[0]=-3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_X(MoveSpeedGear[0]);
XYWAITSTOP = true;
MoveSpeedGear[0]=static_cast<INT>((RX - 128) / 8160 + 1);
MoveSpeedGear[1]=0;
_This->MoveXYZ(E_XBOX_MOVE_XL,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RY<-128 && abs(RX)<-RY/tan(XBOX_Y_ANGLE))
{
MoveSpeedGear[0]=0;
MoveSpeedGear[1]=static_cast<INT>((RY + 128) / 8160.25 - 1);
_This->MoveXYZ(E_XBOX_MOVE_YF,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RY>128 && abs(RX)<RY/tan(XBOX_Y_ANGLE))
{
MoveSpeedGear[0]=0;
MoveSpeedGear[1]=static_cast<INT>((RY - 128) / 8160 + 1);
_This->MoveXYZ(E_XBOX_MOVE_YB,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RX<-128 && RY>-RX*tan(XBOX_XY_ANGLE_BEGIN) && RY<-RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<INT>((RX + 128) / 8160.25 - 1);
MoveSpeedGear[1]=static_cast<INT>((RY - 128) / 8160 + 1);
_This->MoveXYZ(E_XBOX_MOVE_XRYB,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RX<-128 && -RY>-RX*tan(XBOX_XY_ANGLE_BEGIN) && -RY<-RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<INT>((RX + 128) / 8160.25 - 1);
MoveSpeedGear[1]=static_cast<INT>((RY + 128) / 8160.25 - 1);
_This->MoveXYZ(E_XBOX_MOVE_XRYF,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RX>128 && RY>RX*tan(XBOX_XY_ANGLE_BEGIN) && RY<RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<INT>((RX - 128) / 8160 + 1);
MoveSpeedGear[1]=static_cast<INT>((RY - 128) / 8160 +1);
_This->MoveXYZ(E_XBOX_MOVE_XLYB,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RX>128 && -RY>RX*tan(XBOX_XY_ANGLE_BEGIN) && -RY<RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<char>((RX - 128) / 8160 + 1);
MoveSpeedGear[1]=static_cast<char>((RY + 128) / 8160.25 - 1);
MoveSpeedGear[0]=-3;
MoveSpeedGear[1]=3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]);
XYWAITSTOP = true;
MoveSpeedGear[0]=static_cast<INT>((RX - 128) / 8160 + 1);
MoveSpeedGear[1]=static_cast<INT>((RY + 128) / 8160.25 - 1);
_This->MoveXYZ(E_XBOX_MOVE_XLYF,MoveSpeedGear);
bXYWAITSTOP=true;
}
else if(RY<128 && abs(RX)<-RY/tan(XBOX_Y_ANGLE))
{
MoveSpeedGear[1]=static_cast<char>((RY + 128) / 8160.25 - 1);
MoveSpeedGear[0]=3;
MoveSpeedGear[1]=3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_Y(MoveSpeedGear[1]);
XYWAITSTOP = true;
}
else if(RX<128 && -RY>-RX*tan(XBOX_XY_ANGLE_BEGIN) && -RY<-RX*tan(XBOX_XY_ANGLE_END))
{
MoveSpeedGear[0]=static_cast<char>((RX + 128) / 8160.25 - 1);
MoveSpeedGear[1]=static_cast<char>((RY + 128) / 8160.25 - 1);
MoveSpeedGear[0]=3;
MoveSpeedGear[1]=3;
m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_XY(MoveSpeedGear[0],MoveSpeedGear[1]);
XYWAITSTOP = true;
}
else if(XYWAITSTOP)
else if(bXYWAITSTOP)
{
m_pSO7_Proto->_send_cmd_SO7_CMD_STOP_MOVE_XYZ();
XYWAITSTOP = false;
_This->MoveXYZ(E_XBOX_STOPXYZ,MoveSpeedGear);
bXYWAITSTOP=false;
}
//TopLight
@@ -474,13 +543,12 @@ unsigned __stdcall CXBOXController::g_XBox_Thread(LPVOID pThis)
if(_This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_BACK)
***************************************************************/
if(XBoxThreadState == XBTHREAD_EXIT || _This->GetState().Gamepad.wButtons & XINPUT_GAMEPAD_BACK)
if(XBoxThreadState == XBTHREAD_EXIT)
{
break;
ExitThread(0);
}
Sleep(100);
Sleep(200);
};
XBoxThreadState = XBTHREAD_EXIT;
ExitThread(0);
}
}
@@ -7,6 +7,22 @@
#pragma comment(lib, "XInput.lib")
enum EXBOX_MOVEXYZ_TYPE
{
E_XBOX_STOPXYZ,
E_XBOX_MOVE_XL,
E_XBOX_MOVE_XR,
E_XBOX_MOVE_YB,
E_XBOX_MOVE_YF,
E_XBOX_MOVE_ZU,
E_XBOX_MOVE_ZD,
E_XBOX_MOVE_XLYB,
E_XBOX_MOVE_XLYF,
E_XBOX_MOVE_XRYB,
E_XBOX_MOVE_XRYF,
E_XBOX_MOVE_TOTAL=255
};
class CXBOXController
{
protected:
@@ -14,12 +30,12 @@ protected:
static HANDLE XBoxThreadMutex;
static HANDLE XBoxhTriggerEvent;
static int XBoxThreadState;
static bool XYWAITSTOP;
static bool ZWAITSTOP;
XINPUT_STATE m_ControllerState;
int m_ControllerNum;
bool m_IsConnected;
bool MoveXYZ(int _EMoveType,INT* _SpeedGear);
public:
CXBOXController(int playerNumber);
~CXBOXController();