JoystickManager.cpp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "JoystickManager.h"
  2. #include "..\..\common_h\controls.h"
  3. JoystickManager *joystickManager = null;
  4. JoystickManager::JoystickManager() :
  5. m_devices (_FL_),
  6. m_Controls(_FL_),
  7. // m_primaryIndex(-1),
  8. // m_secondaryIndex(-1),
  9. m_isPaused(false)
  10. {
  11. InitControls();
  12. m_index_1 = -1;
  13. m_index_2 = -1;
  14. m_index_3 = -1;
  15. m_index_4 = -1;
  16. joystickManager = this;
  17. }
  18. JoystickManager::~JoystickManager()
  19. {
  20. for( int i = 0 ; i < m_devices; i++ )
  21. {
  22. DELETE(m_devices[i])
  23. }
  24. m_devices.DelAll();
  25. }
  26. void JoystickManager::AddJoystick(IJoystick *joy)
  27. {
  28. Assert(joy);
  29. m_devices.Add(joy);
  30. }
  31. bool JoystickManager::SetJoystickValues(IJoystick::ValueType type, const void *values, long nBytes, long joystickIndex)
  32. {
  33. dword index = -1;
  34. switch( joystickIndex )
  35. {
  36. case 0:
  37. // index = m_primaryIndex;
  38. index = m_index_1;
  39. break;
  40. case 1:
  41. // index = m_secondaryIndex;
  42. index = m_index_2;
  43. break;
  44. case 2:
  45. index = m_index_3;
  46. break;
  47. case 3:
  48. index = m_index_4;
  49. break;
  50. default:
  51. return false;
  52. }
  53. if( index >= m_devices.Size())
  54. return false;
  55. return m_devices[index]->SetValues(type,values,nBytes);
  56. }
  57. void JoystickManager::InitControls()
  58. {
  59. m_Controls.DelAll();
  60. Control ctrl;
  61. ctrl.realDeviceIndex = INVALID_CODE;
  62. ctrl.realControlIndex = INVALID_CODE;
  63. ctrl.name = "gp_X1"; m_Controls.Add(ctrl);
  64. ctrl.name = "gp_Y1"; m_Controls.Add(ctrl);
  65. ctrl.name = "gp_X2"; m_Controls.Add(ctrl);
  66. ctrl.name = "gp_Y2"; m_Controls.Add(ctrl);
  67. ctrl.name = "gp_X3"; m_Controls.Add(ctrl);
  68. ctrl.name = "gp_Y3"; m_Controls.Add(ctrl);
  69. ctrl.name = "gp_X4"; m_Controls.Add(ctrl);
  70. ctrl.name = "gp_Y4"; m_Controls.Add(ctrl);
  71. ctrl.name = "gp_B1"; m_Controls.Add(ctrl);
  72. ctrl.name = "gp_B2"; m_Controls.Add(ctrl);
  73. ctrl.name = "gp_B3"; m_Controls.Add(ctrl);
  74. ctrl.name = "gp_B4"; m_Controls.Add(ctrl);
  75. ctrl.name = "gp_B5"; m_Controls.Add(ctrl);
  76. ctrl.name = "gp_B6"; m_Controls.Add(ctrl);
  77. ctrl.name = "gp_B7"; m_Controls.Add(ctrl);
  78. ctrl.name = "gp_B8"; m_Controls.Add(ctrl);
  79. ctrl.name = "gp_B9"; m_Controls.Add(ctrl);
  80. ctrl.name = "gp_B10"; m_Controls.Add(ctrl);
  81. ctrl.name = "gp_B11"; m_Controls.Add(ctrl);
  82. ctrl.name = "gp_B12"; m_Controls.Add(ctrl);
  83. ctrl.name = "gp_B13"; m_Controls.Add(ctrl);
  84. ctrl.name = "gp_B14"; m_Controls.Add(ctrl);
  85. ctrl.name = "gp_B15"; m_Controls.Add(ctrl);
  86. ctrl.name = "gp_B16"; m_Controls.Add(ctrl);
  87. ctrl.name = "gp_PovH"; m_Controls.Add(ctrl);
  88. ctrl.name = "gp_PovV"; m_Controls.Add(ctrl);
  89. for( dword i = 1; i < MaxJoysticks; i++ )
  90. {
  91. ctrl.name.Format("gp%d_X1", i+1); m_Controls.Add(ctrl);
  92. ctrl.name.Format("gp%d_Y1", i+1); m_Controls.Add(ctrl);
  93. ctrl.name.Format("gp%d_X2", i+1); m_Controls.Add(ctrl);
  94. ctrl.name.Format("gp%d_Y2", i+1); m_Controls.Add(ctrl);
  95. ctrl.name.Format("gp%d_X3", i+1); m_Controls.Add(ctrl);
  96. ctrl.name.Format("gp%d_Y3", i+1); m_Controls.Add(ctrl);
  97. ctrl.name.Format("gp%d_X4", i+1); m_Controls.Add(ctrl);
  98. ctrl.name.Format("gp%d_Y4", i+1); m_Controls.Add(ctrl);
  99. ctrl.name.Format("gp%d_B1", i+1); m_Controls.Add(ctrl);
  100. ctrl.name.Format("gp%d_B2", i+1); m_Controls.Add(ctrl);
  101. ctrl.name.Format("gp%d_B3", i+1); m_Controls.Add(ctrl);
  102. ctrl.name.Format("gp%d_B4", i+1); m_Controls.Add(ctrl);
  103. ctrl.name.Format("gp%d_B5", i+1); m_Controls.Add(ctrl);
  104. ctrl.name.Format("gp%d_B6", i+1); m_Controls.Add(ctrl);
  105. ctrl.name.Format("gp%d_B7", i+1); m_Controls.Add(ctrl);
  106. ctrl.name.Format("gp%d_B8", i+1); m_Controls.Add(ctrl);
  107. ctrl.name.Format("gp%d_B9", i+1); m_Controls.Add(ctrl);
  108. ctrl.name.Format("gp%d_B10", i+1); m_Controls.Add(ctrl);
  109. ctrl.name.Format("gp%d_B11", i+1); m_Controls.Add(ctrl);
  110. ctrl.name.Format("gp%d_B12", i+1); m_Controls.Add(ctrl);
  111. ctrl.name.Format("gp%d_B13", i+1); m_Controls.Add(ctrl);
  112. ctrl.name.Format("gp%d_B14", i+1); m_Controls.Add(ctrl);
  113. ctrl.name.Format("gp%d_B15", i+1); m_Controls.Add(ctrl);
  114. ctrl.name.Format("gp%d_B16", i+1); m_Controls.Add(ctrl);
  115. ctrl.name.Format("gp%d_PovH", i+1); m_Controls.Add(ctrl);
  116. ctrl.name.Format("gp%d_PovV", i+1); m_Controls.Add(ctrl);
  117. }
  118. }
  119. string GetNameNoNumber(const string &name)
  120. {
  121. long nameStart = name.FindSubStr("_");
  122. ++nameStart;
  123. string str = "gp_";
  124. str += name.GetBuffer() + nameStart;
  125. return str;
  126. }
  127. void JoystickManager::AssignIndex(ControllerType type, long deviceIndex)
  128. {
  129. // Assert((dword)deviceIndex < m_devices.Size());
  130. const dword ControlsPerDevice = 26; // 8 осей + 16 кнопок + PovV + PovH
  131. for( dword i = 0 ; i < ControlsPerDevice ; i++ )
  132. {
  133. m_Controls[type*ControlsPerDevice + i].realDeviceIndex = deviceIndex;
  134. if( deviceIndex != INVALID_CODE )
  135. {
  136. m_Controls[type*ControlsPerDevice + i].realControlIndex =
  137. m_devices[deviceIndex]->GetIndex(
  138. GetNameNoNumber(m_Controls[type*ControlsPerDevice + i].name).c_str());
  139. }
  140. }
  141. }
  142. void JoystickManager::Update(float deltaTime)
  143. {
  144. for( int i = 0; i < m_devices ; i++ )
  145. {
  146. m_devices[i]->Update(deltaTime);
  147. if( m_index_1 < 0 )
  148. {
  149. #ifdef _XBOX
  150. if( m_devices[i]->IsStartPressed())
  151. {
  152. m_index_1 = i;
  153. switch( i )
  154. {
  155. case 0:
  156. m_index_2 = 1;
  157. m_index_3 = 2;
  158. m_index_4 = 3; break;
  159. case 1:
  160. m_index_2 = 0;
  161. m_index_3 = 2;
  162. m_index_4 = 3; break;
  163. case 2:
  164. m_index_2 = 0;
  165. m_index_3 = 1;
  166. m_index_4 = 3; break;
  167. case 3:
  168. m_index_2 = 0;
  169. m_index_3 = 1;
  170. m_index_4 = 2; break;
  171. }
  172. AssignIndex(Primary ,m_index_1);
  173. AssignIndex(Secondary,m_index_2);
  174. AssignIndex(Third ,m_index_3);
  175. AssignIndex(Fourth ,m_index_4);
  176. m_isPaused = false;
  177. }
  178. #else
  179. m_index_1 = 0;
  180. m_index_2 = 1;
  181. m_index_3 = 2;
  182. m_index_4 = 3;
  183. AssignIndex(Primary ,m_index_1);
  184. AssignIndex(Secondary,m_index_2);
  185. AssignIndex(Third ,m_index_3);
  186. AssignIndex(Fourth ,m_index_4);
  187. m_isPaused = false;
  188. #endif
  189. }
  190. /////////////////////////////////////////////////////////////
  191. if( m_index_1 >= 0 && m_devices[m_index_1]->IsDisconnected())
  192. {
  193. // m_index_1 = -1;
  194. m_isPaused = true;
  195. }
  196. /* if( m_index_2 >= 0 && m_devices[m_index_2]->IsDisconnected())
  197. {
  198. m_index_2 = -1;
  199. m_isPaused = true;
  200. }
  201. if( m_index_3 >= 0 && m_devices[m_index_3]->IsDisconnected())
  202. {
  203. m_index_3 = -1;
  204. m_isPaused = true;
  205. }
  206. if( m_index_4 >= 0 && m_devices[m_index_4]->IsDisconnected())
  207. {
  208. m_index_4 = -1;
  209. m_isPaused = true;
  210. }*/
  211. }
  212. }
  213. long JoystickManager::GetIndex(const char *deviceControl)
  214. {
  215. for( int i = 0; i < m_Controls ; i++ )
  216. {
  217. if( m_Controls[i].name == deviceControl )
  218. return i;
  219. }
  220. return INVALID_CODE;
  221. }
  222. float JoystickManager::GetRawValue(long controlIndex) const
  223. {
  224. if ((dword)controlIndex >= m_Controls.Size())
  225. return 0.0f;
  226. #ifdef _XBOX
  227. if( m_Controls[controlIndex].realDeviceIndex == INVALID_CODE )
  228. return 0.0f;
  229. return m_devices[m_Controls[controlIndex].realDeviceIndex]->GetRawValue(
  230. m_Controls[controlIndex].realControlIndex);
  231. #else
  232. // ищем первый джойстик у которого нажата данная кнопка (added by Nikita)
  233. const dword ControlsPerDevice = 26; // 8 осей + 16 кнопок + PovV + PovH
  234. long nControlNum = controlIndex % ControlsPerDevice;
  235. float fMaxVal = 0.f;
  236. for( long n=0; n<m_devices && n<4; n++ )
  237. {
  238. long nCurControlIndex = n * ControlsPerDevice + nControlNum;
  239. float fVal = 0.f;
  240. if( nCurControlIndex < m_Controls )
  241. {
  242. long nDevice = m_Controls[nCurControlIndex].realDeviceIndex;
  243. long nControl = m_Controls[nCurControlIndex].realControlIndex;
  244. if( nDevice != INVALID_CODE && nControl != INVALID_CODE && m_devices[nDevice] != NULL )
  245. fVal = m_devices[nDevice]->GetRawValue( nControl );
  246. if( fabs(fVal) > fabs(fMaxVal) )
  247. fMaxVal = fVal;
  248. }
  249. }
  250. return fMaxVal;
  251. #endif
  252. }
  253. void JoystickManager::EndFrame()
  254. {
  255. for( int i = 0; i < m_devices ; i++ )
  256. {
  257. m_devices[i]->EndFrame();
  258. }
  259. }