gamepad_util.cpp 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "gamepad_util.h"
  2. #include "triton.h"
  3. #include "config.h"
  4. uint8_t swStick(int16_t v,bool invert){ // int16 (center 0) -> uint8 (center 0x80)
  5. int32_t a = 0x80 + (invert ? -((int32_t)v>>8) : ((int32_t)v>>8));
  6. if(a<0)a=0; if(a>255)a=255; return (uint8_t)a;
  7. }
  8. // Map Steam trackpad s16 coords into a 0..max axis (centered touch -> mid-range).
  9. uint16_t padNormU16(int16_t v, uint16_t maxv){
  10. int32_t t=((int32_t)v+32768); if(t<0)t=0; if(t>65535)t=65535;
  11. return (uint16_t)((t*(int32_t)maxv)/65535);
  12. }
  13. uint16_t touchHalfX(int16_t v, bool rightHalf){
  14. uint16_t halfMax = TOUCH_PAD_W/2 - 1;
  15. uint16_t x = padNormU16(v, halfMax);
  16. return rightHalf ? (uint16_t)(TOUCH_PAD_W/2 + x) : x;
  17. }
  18. uint16_t touchYInv(int16_t v, uint16_t height){
  19. uint16_t maxy = height - 1;
  20. return (uint16_t)(maxy - padNormU16(v, maxy));
  21. }
  22. void touchPackPoint(uint8_t* base, int finger, bool touch, uint16_t x, uint16_t y){
  23. uint8_t* f=base+finger*4;
  24. if(!touch){ f[0]=0x80; f[1]=0; f[2]=0; f[3]=0; return; }
  25. f[0]=(uint8_t)(finger&0x7F);
  26. f[1]=(uint8_t)(x&0xFF);
  27. f[2]=(uint8_t)(((x>>8)&0x0F)|((y&0x0F)<<4));
  28. f[3]=(uint8_t)((y>>4)&0xFF);
  29. }
  30. void touchPackPads(uint8_t* pts, bool lTouch, bool rTouch,
  31. uint16_t lx, uint16_t ly, uint16_t rx, uint16_t ry){
  32. touchPackPoint(pts, 0, false, 0, 0);
  33. touchPackPoint(pts, 1, false, 0, 0);
  34. if(lTouch && rTouch){
  35. touchPackPoint(pts, 0, true, lx, ly);
  36. touchPackPoint(pts, 1, true, rx, ry);
  37. } else if(lTouch){
  38. touchPackPoint(pts, 0, true, lx, ly);
  39. } else if(rTouch){
  40. touchPackPoint(pts, 0, true, rx, ry);
  41. }
  42. }
  43. void steamPadsToTouch(uint32_t b, uint16_t touchH, int16_t lpx, int16_t lpy, int16_t rpx, int16_t rpy,
  44. uint16_t* lx, uint16_t* ly, uint16_t* rx, uint16_t* ry){
  45. bool lt=(b&TB_LPADT)||(b&TB_LPADC), rt=(b&TB_RPADT)||(b&TB_RPADC);
  46. *lx=touchHalfX(lpx, false); *ly=touchYInv(lpy, touchH);
  47. *rx=touchHalfX(rpx, true); *ry=touchYInv(rpy, touchH);
  48. if(lt && !(b&TB_LPADT)){ *lx=TOUCH_PAD_W/4; *ly=touchH/2; }
  49. if(rt && !(b&TB_RPADT)){ *rx=TOUCH_PAD_W/4*3; *ry=touchH/2; }
  50. }
  51. // Map g_back[] paddle code -> Steam button flags (same codes as codeToXB / codeToSwitch).
  52. static void psOrBackCode(uint32_t* b, uint8_t c){
  53. switch(c){ case 1:*b|=TB_A; break; case 2:*b|=TB_B; break; case 3:*b|=TB_X; break; case 4:*b|=TB_Y; break;
  54. case 5:*b|=TB_LB; break; case 6:*b|=TB_RB; break; case 7:*b|=TB_L3; break; case 8:*b|=TB_R3; break;
  55. case 9:*b|=TB_VIEW; break; case 10:*b|=TB_MENU; break; case 11:*b|=TB_STEAM; break;
  56. case 12:*b|=TB_DUP; break; case 13:*b|=TB_DDN; break; case 14:*b|=TB_DLF; break; case 15:*b|=TB_DRT; break; default: break; }
  57. }
  58. uint32_t psButtonsFromSteam(uint32_t raw){
  59. uint32_t b=raw;
  60. if((b&CHORD_BACK4)==CHORD_BACK4) b&=~(uint32_t)(TB_A|TB_B|TB_X|TB_Y);
  61. if(b&TB_L4) psOrBackCode(&b, g_back[0]); if(b&TB_R4) psOrBackCode(&b, g_back[1]);
  62. if(b&TB_L5) psOrBackCode(&b, g_back[2]); if(b&TB_R5) psOrBackCode(&b, g_back[3]);
  63. return b;
  64. }
  65. // DualSense / DS4 buttons[1]: L1..R3, Create(Share), Options(Start)
  66. uint8_t psShouldersByte(uint32_t b){
  67. return ((b&TB_LB)?0x01:0)|((b&TB_RB)?0x02:0)
  68. |((g_in.lt>SW_TRIG_ON||(b&0x8000000u))?0x04:0)|((g_in.rt>SW_TRIG_ON||(b&0x800000u))?0x08:0)
  69. |((b&TB_MENU)?0x10:0)|((b&TB_VIEW)?0x20:0) // Menu=Options, View=Create/Share
  70. |((b&TB_L3)?0x40:0)|((b&TB_R3)?0x80:0);
  71. }
  72. uint8_t psHatNibble(uint32_t b){
  73. bool u=b&TB_DUP,d=b&TB_DDN,l=b&TB_DLF,r=b&TB_DRT;
  74. if(u&&r)return 1; if(r&&d)return 3; if(d&&l)return 5; if(l&&u)return 7;
  75. if(u)return 0; if(r)return 2; if(d)return 4; if(l)return 6; return 8;
  76. }
  77. uint8_t psFaceNibble(uint32_t b){
  78. uint8_t f=0;
  79. if(g_abSwap){
  80. if(b&TB_A)f|=0x40; if(b&TB_B)f|=0x20; if(b&TB_X)f|=0x80; if(b&TB_Y)f|=0x10;
  81. } else {
  82. if(b&TB_A)f|=0x20; if(b&TB_B)f|=0x40; if(b&TB_X)f|=0x10; if(b&TB_Y)f|=0x80;
  83. }
  84. return f;
  85. }