diff --git a/CMakeLists.txt b/CMakeLists.txt index 74f6c97a..0bf8164e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,6 +87,7 @@ target_link_libraries(${PROJECT_NAME}.elf -lSceDisplay_stub -lSceCtrl_stub + -lSceTouch_stub -lSceReg_stub -lSceNet_stub -lSceSysmodule_stub diff --git a/src/main.c b/src/main.c index 3226dc7c..111d2d94 100644 --- a/src/main.c +++ b/src/main.c @@ -49,6 +49,7 @@ #include #include +#include #include "graphics.h" @@ -90,12 +91,44 @@ static short a2m(unsigned char in) { #define BTN(x, y) \ if (pad.buttons & x) \ btn |= y; + +#define lerp(value, from_max, to_max) ((((value*10) * (to_max*10))/(from_max*10))/10) + +#define TOUCH_TOP(scr) \ + ((lerp((scr).report[0].y, 1087, 544) - 56) < 272) + +#define TOUCH_BUTTOM(scr) \ + ((lerp((scr).report[0].y, 1087, 544) - 56) >= 272) + +#define TOUCH_LEFT(scr, top) \ + ((scr).reportNum > 0 && (lerp((scr).report[0].x, 1919, 960) - 50) < 480 && \ + (top ? TOUCH_TOP((scr)) : TOUCH_BUTTOM((scr)))) + +#define TOUCH_RIGHT(scr, top) \ + ((scr).reportNum > 0 && (lerp((scr).report[0].x, 1919, 960) - 50) >= 480 && \ + (top ? TOUCH_TOP((scr)) : TOUCH_BUTTOM((scr)))) + +#define TOUCH_LEFT_BTN(scr, top, y) \ + if (TOUCH_LEFT((scr), (top))) \ + btn |= y + +#define TOUCH_RIGHT_BTN(scr, top, y) \ + if (TOUCH_RIGHT((scr), (top))) \ + btn |= y + static void vita_process_input(void) { sceCtrlSetSamplingMode(SCE_CTRL_MODE_ANALOG_WIDE); + sceTouchSetSamplingState(SCE_TOUCH_PORT_FRONT, SCE_TOUCH_SAMPLING_STATE_START); + sceTouchSetSamplingState(SCE_TOUCH_PORT_BACK, SCE_TOUCH_SAMPLING_STATE_START); + SceCtrlData pad; + //SceTouchData front; + SceTouchData back; while (1) { memset(&pad, 0, sizeof(pad)); sceCtrlPeekBufferPositive(0, &pad, 1); + //sceTouchPeek(SCE_TOUCH_PORT_FRONT, &front, 1); + sceTouchPeek(SCE_TOUCH_PORT_BACK, &back, 1); short btn = 0; BTN(SCE_CTRL_UP, UP_FLAG); @@ -114,7 +147,10 @@ static void vita_process_input(void) { BTN(SCE_CTRL_CROSS, A_FLAG); BTN(SCE_CTRL_SQUARE, X_FLAG); - LiSendControllerEvent(btn, 0, 0, a2m(pad.lx), -a2m(pad.ly), a2m(pad.rx), -a2m(pad.ry)); + TOUCH_LEFT_BTN(back, false, LS_CLK_FLAG); + TOUCH_RIGHT_BTN(back, false, RS_CLK_FLAG); + + LiSendControllerEvent(btn, TOUCH_LEFT(back, true) ? 0xff : 0, TOUCH_RIGHT(back, true) ? 0xff : 0, a2m(pad.lx), -a2m(pad.ly), a2m(pad.rx), -a2m(pad.ry)); sceKernelDelayThread(1 * 1000); // 1 ms }