XBoxDevice.cpp 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include "XBoxDevice.h"
  2. #include "..\..\common_h\Render.h"
  3. #include "..\..\common_h\controls.h"
  4. #ifdef _XBOX
  5. #include <xtl.h>
  6. #else
  7. #include <xinput.h>
  8. #endif
  9. XBoxDevice:: XBoxDevice(unsigned int ctrlIndex, const ControlsIniParser &parser) :
  10. m_Controller(ctrlIndex),
  11. m_Controls(_FL_)
  12. {
  13. XINPUT_VIBRATION v = {0,0};
  14. XInputSetState(m_Controller,&v);
  15. InitControls(parser.GetMappingTable(XBOX360_DEVICE));
  16. dwPacketNumber = -1;
  17. }
  18. XBoxDevice::~XBoxDevice()
  19. {
  20. XINPUT_VIBRATION v = {0,0};
  21. XInputSetState(m_Controller,&v);
  22. }
  23. static const char* GetMappedName(const char* hwName, const ControlsIniParser::Table& table, bool& inverted)
  24. {
  25. string s1, s2;
  26. for (unsigned int i = 0; i < table.items.Size(); ++i)
  27. {
  28. s1 = table.items[i].hwName;
  29. s2 = hwName;
  30. s1.Upper();
  31. s2.Upper();
  32. if (s1.FindSubStr(s2) != -1)
  33. {
  34. inverted = s1[0] == '-';
  35. return table.items[i].logName.c_str();
  36. }
  37. }
  38. inverted = false;
  39. return hwName;
  40. }
  41. void XBoxDevice::InitControls(const ControlsIniParser::Table& table)
  42. {
  43. Control ctrl;
  44. ctrl.type = Control::Axis;
  45. ctrl.name = GetMappedName("hw_Axis1", table, ctrl.inverted); m_Controls.Add(ctrl);
  46. ctrl.name = GetMappedName("hw_Axis2", table, ctrl.inverted); m_Controls.Add(ctrl);
  47. ctrl.name = GetMappedName("hw_Axis3", table, ctrl.inverted); m_Controls.Add(ctrl);
  48. ctrl.name = GetMappedName("hw_Axis4", table, ctrl.inverted); m_Controls.Add(ctrl);
  49. ctrl.type = Control::Slider;
  50. ctrl.name = GetMappedName("hw_Axis5", table, ctrl.inverted); m_Controls.Add(ctrl);
  51. ctrl.type = Control::Button;
  52. ctrl.name = GetMappedName("hw_b1", table, ctrl.inverted); m_Controls.Add(ctrl);
  53. ctrl.name = GetMappedName("hw_b2", table, ctrl.inverted); m_Controls.Add(ctrl);
  54. ctrl.name = GetMappedName("hw_b3", table, ctrl.inverted); m_Controls.Add(ctrl);
  55. ctrl.name = GetMappedName("hw_b4", table, ctrl.inverted); m_Controls.Add(ctrl);
  56. ctrl.name = GetMappedName("hw_b5", table, ctrl.inverted); m_Controls.Add(ctrl);
  57. ctrl.name = GetMappedName("hw_b6", table, ctrl.inverted); m_Controls.Add(ctrl);
  58. ctrl.name = GetMappedName("hw_b7", table, ctrl.inverted); m_Controls.Add(ctrl);
  59. ctrl.name = GetMappedName("hw_b8", table, ctrl.inverted); m_Controls.Add(ctrl);
  60. ctrl.name = GetMappedName("hw_b9", table, ctrl.inverted); m_Controls.Add(ctrl);
  61. ctrl.name = GetMappedName("hw_b10", table, ctrl.inverted); m_Controls.Add(ctrl);
  62. ctrl.type = Control::POV_H;
  63. ctrl.name = GetMappedName("hw_PovH1", table, ctrl.inverted); m_Controls.Add(ctrl);
  64. ctrl.type = Control::POV_V;
  65. ctrl.name = GetMappedName("hw_PovV1", table, ctrl.inverted); m_Controls.Add(ctrl);
  66. ///////////////////////////////
  67. indexStart = GetIndex("gp_B7");
  68. }
  69. void XBoxDevice::Update(float DeltaTime)
  70. {
  71. XINPUT_STATE state;
  72. if( XInputGetState(m_Controller,&state) != ERROR_SUCCESS)
  73. {
  74. for( int i = 0 ; i < m_Controls; i++ )
  75. {
  76. m_Controls[i].value = 0.0f;
  77. }
  78. return;
  79. }
  80. if( state.dwPacketNumber == dwPacketNumber )
  81. return;
  82. dwPacketNumber = state.dwPacketNumber;
  83. /* if (state.Gamepad.sThumbLX < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&
  84. state.Gamepad.sThumbLX > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
  85. state.Gamepad.sThumbLX = 0;
  86. if (state.Gamepad.sThumbLY < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE &&
  87. state.Gamepad.sThumbLY > -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
  88. state.Gamepad.sThumbLY = 0;
  89. if (state.Gamepad.sThumbRX < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&
  90. state.Gamepad.sThumbRX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
  91. state.Gamepad.sThumbRX = 0;
  92. if (state.Gamepad.sThumbRY < XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&
  93. state.Gamepad.sThumbRY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
  94. state.Gamepad.sThumbRY = 0;*/
  95. const short l_x_l = XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE + 3000;
  96. const short l_x_h = XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE + 1000;
  97. const short l_y_l = XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE + 2000;
  98. const short l_y_h = XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE + 2000;
  99. const short r_x_l = XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE + 2000;
  100. const short r_x_h = XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE + 2000;
  101. const short r_y_l = XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE + 2000;
  102. const short r_y_h = XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE + 2000;
  103. if( state.Gamepad.sThumbLX < l_x_h &&
  104. state.Gamepad.sThumbLX > -l_x_l )
  105. state.Gamepad.sThumbLX = 0;
  106. if( state.Gamepad.sThumbLY < l_y_h &&
  107. state.Gamepad.sThumbLY > -l_y_l )
  108. state.Gamepad.sThumbLY = 0;
  109. if (state.Gamepad.sThumbRX < r_x_h &&
  110. state.Gamepad.sThumbRX > -r_x_l )
  111. state.Gamepad.sThumbRX = 0;
  112. if (state.Gamepad.sThumbRY < r_y_h &&
  113. state.Gamepad.sThumbRY > -r_y_l )
  114. state.Gamepad.sThumbRY = 0;
  115. m_Controls[0].value = state.Gamepad.sThumbLX/(float)0x7FFF;
  116. m_Controls[1].value = state.Gamepad.sThumbLY/(float)0x7FFF;
  117. m_Controls[2].value = state.Gamepad.sThumbRX/(float)0x7FFF;
  118. m_Controls[3].value = state.Gamepad.sThumbRY/(float)0x7FFF;
  119. if( state.Gamepad.bLeftTrigger < XINPUT_GAMEPAD_TRIGGER_THRESHOLD )
  120. state.Gamepad.bLeftTrigger = 0;
  121. if( state.Gamepad.bRightTrigger < XINPUT_GAMEPAD_TRIGGER_THRESHOLD )
  122. state.Gamepad.bRightTrigger = 0;
  123. // оба шифта как одна ось
  124. m_Controls[4].value = (state.Gamepad.bLeftTrigger-state.Gamepad.bRightTrigger) / 255.0f;
  125. m_Controls[5].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_A) != 0 ? 1.0f : 0.0f;
  126. m_Controls[6].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_B) != 0 ? 1.0f : 0.0f;
  127. m_Controls[7].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_X) != 0 ? 1.0f : 0.0f;
  128. m_Controls[8].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_Y) != 0 ? 1.0f : 0.0f;
  129. m_Controls[9].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER) != 0 ? 1.0f : 0.0f;
  130. m_Controls[10].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER) != 0 ? 1.0f : 0.0f;
  131. m_Controls[11].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_BACK) != 0 ? 1.0f : 0.0f;
  132. m_Controls[12].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_START) != 0 ? 1.0f : 0.0f;
  133. m_Controls[13].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB) != 0 ? 1.0f : 0.0f;
  134. m_Controls[14].value = (state.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB) != 0 ? 1.0f : 0.0f;
  135. m_Controls[15].value = 0.0f;
  136. (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT) != 0 ? m_Controls[15].value = 1.0f : m_Controls[15].value;
  137. (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT) != 0 ? m_Controls[15].value = -1.0f : m_Controls[15].value;
  138. m_Controls[16].value = 0.0f;
  139. (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP) != 0 ? m_Controls[16].value = 1.0f : m_Controls[16].value;
  140. (state.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN) != 0 ? m_Controls[16].value = -1.0f : m_Controls[16].value;
  141. }
  142. void XBoxDevice::EndFrame()
  143. {
  144. #ifndef _XBOX
  145. // if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000)
  146. if( api->DebugKeyState(VK_NUMPAD0))
  147. {
  148. IRender* render = (IRender*)api->GetService("DX9Render");
  149. for (unsigned int i = 0; i < m_Controls.Size(); ++i)
  150. render->GetSystemFont()->Print((m_Controller+1)*200.0f, i*15.0f, "%s : %0.2f", m_Controls[i].name.GetBuffer(), m_Controls[i].value);
  151. }
  152. #endif
  153. }
  154. long XBoxDevice::GetIndex(const char *deviceControl)
  155. {
  156. for( int i = 0; i < m_Controls ; i++ )
  157. {
  158. if( m_Controls[i].name == deviceControl )
  159. return i;
  160. }
  161. return INVALID_CODE;
  162. }
  163. float XBoxDevice::GetRawValue(long controlIndex) const
  164. {
  165. if((dword)controlIndex >= m_Controls.Size())
  166. return 0;
  167. return m_Controls[controlIndex].inverted ? -m_Controls[controlIndex].value : m_Controls[controlIndex].value;
  168. }
  169. bool XBoxDevice::IsStartPressed() const
  170. {
  171. return fabsf(GetRawValue(indexStart)) > 0.001f;
  172. }
  173. bool XBoxDevice::IsDisconnected() const
  174. {
  175. XINPUT_STATE state;
  176. return XInputGetState(m_Controller, &state) != ERROR_SUCCESS;
  177. }
  178. bool XBoxDevice::SetValues(ValueType type, const void *values, long nBytes)
  179. {
  180. if( type == FFRotorSpeed )
  181. {
  182. long n = nBytes/sizeof(float);
  183. Assert(n >= 2)
  184. float ls = ((float *)values)[0];
  185. float rs = ((float *)values)[1];
  186. ls *= 65535.0f; if( ls > 65535.0f ) ls = 65535.0f;
  187. rs *= 65535.0f; if( rs > 65535.0f ) rs = 65535.0f;
  188. XINPUT_VIBRATION v = {(WORD)ls,(WORD)rs};
  189. XInputSetState(m_Controller,&v);
  190. return true;
  191. }
  192. else
  193. return false;
  194. }