From 671383aa6b4f12a8befa881619fc304e97467d1c Mon Sep 17 00:00:00 2001 From: Sunguk Lee Date: Sun, 21 Aug 2016 20:36:51 +0900 Subject: [PATCH] vita: Add new button map using touchscreen - L3(LS CLK): Front half left - R3(RS CLK): Front half right - L2(LT): Back half left - R2(RT): Back half right --- CMakeLists.txt | 1 + src/main.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) 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..b7cd8b9e 100644 --- a/src/main.c +++ b/src/main.c @@ -49,6 +49,7 @@ #include #include +#include #include "graphics.h" @@ -90,12 +91,36 @@ 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_LEFT(scr) \ + ((scr).reportNum > 0 && (lerp((scr).report[0].x, 1919, 960) - 50) < 480) + +#define TOUCH_RIGHT(scr) \ + ((scr).reportNum > 0 && (lerp((scr).report[0].x, 1919, 960) - 50) >= 480) + +#define TOUCH_LEFT_BTN(scr, y) \ + if (TOUCH_LEFT((scr))) \ + btn |= y + +#define TOUCH_RIGHT_BTN(scr, y) \ + if (TOUCH_RIGHT((scr))) \ + 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 +139,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(front, LS_CLK_FLAG); + TOUCH_RIGHT_BTN(front, RS_CLK_FLAG); + + LiSendControllerEvent(btn, TOUCH_LEFT(back) ? 0xff : 0, TOUCH_RIGHT(back) ? 0xff : 0, a2m(pad.lx), -a2m(pad.ly), a2m(pad.rx), -a2m(pad.ry)); sceKernelDelayThread(1 * 1000); // 1 ms }