#ifndef _PSP2_CTRL_H_ #define _PSP2_CTRL_H_ #include #include #ifdef __cplusplus extern "C" { #endif enum { SCE_CTRL_ERROR_INVALID_ARG = 0x80340001, SCE_CTRL_ERROR_PRIV_REQUIRED = 0x80340002, SCE_CTRL_ERROR_FATAL = 0x803400FF }; /** Enumeration for the digital controller buttons. * L1/R1/L3/R3 only can bind using sceCtrlReadBufferPositiveExt2 */ enum SceCtrlPadButtons { SCE_CTRL_SELECT = 0x000001, //!< Select button. SCE_CTRL_L3 = 0x000002, //!< L3 button. SCE_CTRL_R3 = 0x000004, //!< R3 button. SCE_CTRL_START = 0x000008, //!< Start button. SCE_CTRL_UP = 0x000010, //!< Up D-Pad button. SCE_CTRL_RIGHT = 0x000020, //!< Right D-Pad button. SCE_CTRL_DOWN = 0x000040, //!< Down D-Pad button. SCE_CTRL_LEFT = 0x000080, //!< Left D-Pad button. SCE_CTRL_LTRIGGER = 0x000100, //!< Left trigger. SCE_CTRL_RTRIGGER = 0x000200, //!< Right trigger. SCE_CTRL_L1 = 0x000400, //!< L1 button. SCE_CTRL_R1 = 0x000800, //!< R1 button. SCE_CTRL_TRIANGLE = 0x001000, //!< Triangle button. SCE_CTRL_CIRCLE = 0x002000, //!< Circle button. SCE_CTRL_CROSS = 0x004000, //!< Cross button. SCE_CTRL_SQUARE = 0x008000, //!< Square button. SCE_CTRL_INTERCEPTED = 0x010000, //!< Input not available because intercepted by another application SCE_CTRL_VOLUP = 0x100000, //!< Volume up button. SCE_CTRL_VOLDOWN = 0x200000 //!< Volume down button. }; /** Enumeration for the controller types. */ enum SceCtrlExternalInputMode { SCE_CTRL_TYPE_UNPAIRED = 0, SCE_CTRL_TYPE_PHY = 1, //!< Physical controller for VITA SCE_CTRL_TYPE_VIRT = 2, //!< Virtual controller for PSTV SCE_CTRL_TYPE_DS3 = 4, //!< DualShock 3 SCE_CTRL_TYPE_DS4 = 8 //!< DualShock 4 }; /** Controller mode. */ enum SceCtrlPadInputMode { /** Digitial buttons only. */ SCE_CTRL_MODE_DIGITAL = 0, /** Digital buttons + Analog support. */ SCE_CTRL_MODE_ANALOG = 1, /** Same as ::SCE_CTRL_MODE_ANALOG, but with larger range for analog sticks. */ SCE_CTRL_MODE_ANALOG_WIDE = 2 }; /** Returned controller data */ typedef struct SceCtrlData { /** The current read frame. */ uint64_t timeStamp; /** Bit mask containing zero or more of ::CtrlButtons. */ unsigned int buttons; /** Left analogue stick, X axis. */ unsigned char lx; /** Left analogue stick, Y axis. */ unsigned char ly; /** Right analogue stick, X axis. */ unsigned char rx; /** Right analogue stick, Y axis. */ unsigned char ry; /** Reserved. */ uint8_t reserved0[4]; /** Left trigger (L2) */ unsigned char lt; /** Right trigger (R2) */ unsigned char rt; /** Reserved. */ uint8_t reserved1[10]; } SceCtrlData; /** Structure to pass as argument to ::sceCtrlSetRapidFire */ typedef struct SceCtrlRapidFireRule { unsigned int Mask; unsigned int Trigger; unsigned int Target; unsigned int Delay; unsigned int Make; unsigned int Break; } SceCtrlRapidFireRule; /** Structure to pass as argument to ::sceCtrlSetActuator */ typedef struct SceCtrlActuator { unsigned char small; //!< Vibration strength of the small motor unsigned char large; //!< Vibration strength of the large motor uint8_t unk[6]; //!< Unknown } SceCtrlActuator; /** Structure to pass as argument to ::sceCtrlGetControllerPortInfo */ typedef struct SceCtrlPortInfo { uint8_t port[5]; //!< Controller type of each ports uint8_t unk[11]; //!< Unknown } SceCtrlPortInfo; /** * Set the controller mode. * * @param[in] mode - One of ::CtrlMode. * * @return The previous mode, <0 on error. */ int sceCtrlSetSamplingMode(int mode); /** * Set the controller extend mode. * * @param[in] mode - One of ::CtrlMode. * * @return The previous mode, <0 on error. */ int sceCtrlSetSamplingModeExt(int mode); /** * Get the current controller mode. * * @param[out] pMode - Return value, see ::CtrlMode. * * @return The current mode, <0 on error. */ int sceCtrlGetSamplingMode(int *pMode); /** * Get the controller state information (polling, positive logic). * * @param[in] port - use 0. * @param[out] *pad_data - see ::SceCtrlData. * @param[in] count - Buffers count. * * @return Buffers count, between 1 and 'count'. <0 on error. */ int sceCtrlPeekBufferPositive(int port, SceCtrlData *pad_data, int count); /** * Get the controller state information (polling, negative logic). * * @param[in] port - use 0. * @param[out] *pad_data - see ::SceCtrlData. * @param[in] count - Buffers count. * * @return Buffers count, between 1 and 'count'. <0 on error. */ int sceCtrlPeekBufferNegative(int port, SceCtrlData *pad_data, int count); /** * Get the controller state information (blocking, positive logic). * * @param[in] port - use 0. * @param[out] *pad_data - see ::SceCtrlData. * @param[in] count - Buffers count. * * @return Buffers count, between 1 and 'count'. <0 on error. */ int sceCtrlReadBufferPositive(int port, SceCtrlData *pad_data, int count); /** * Get the controller extended state information (blocking, positive logic). * * This function will bind L/R tringger value to L1/R1 instead of LTRIGGER/RTRIGGER * * @param[in] port - use 0. * @param[out] *pad_data - see ::SceCtrlData. * @param[in] count - Buffers count. * * @return Buffers count, between 1 and 'count'. <0 on error. */ int sceCtrlReadBufferPositiveExt2(int port, SceCtrlData *pad_data, int count); /** * Get the controller state information (blocking, negative logic). * * @param[in] port - use 0. * @param[out] *pad_data - see ::SceCtrlData. * @param[in] count - Buffers count. * * @return Buffers count, between 1 and 'count'. <0 on error. */ int sceCtrlReadBufferNegative(int port, SceCtrlData *pad_data, int count); /** * Set rules for button rapid fire * * @param[in] port - use 0. * @param[in] idx - rule index between 0-15 * @param[in] pRule - structure ::SceCtrlRapidFireRule. * * @return 0, <0 on error. */ int sceCtrlSetRapidFire(int port, int idx, const SceCtrlRapidFireRule* pRule); /** * Clear rules for button rapid fire * * @param[in] port - use 0. * @param[in] idx - rule index between 0-15 * * @return 0, <0 on error. */ int sceCtrlClearRapidFire(int port, int idx); /** * Control the actuator (vibrate) on paired controllers. * * @param[in] port - use 1 for the first paired controller, etc. * @param[in] state - see ::SceCtrlActuator * * @return 0, <0 on error. */ int sceCtrlSetActuator(int port, const SceCtrlActuator* pState); /** * Control the light bar on paired controllers. * * @param[in] port - use 1 for the first paired controller, etc. * @param[in] r - red intensity * @param[in] g - green intensity * @param[in] b - blue intensity * * @return 0, <0 on error. */ int sceCtrlSetLightBar(int port, SceUInt8 r, SceUInt8 g, SceUInt8 b); /** * Get controller port information. * * @param[out] info - see ::SceCtrlPortInfo * @return 0, <0 on error */ int sceCtrlGetControllerPortInfo(SceCtrlPortInfo *info); /** * Get controller battery information. * * @param[in] port - use 1 for the first paired controller, etc. * @param[out] batt - battery level, between 0-5, 0xEE charging, 0xEF charged * * @return 0, <0 on error. */ int sceCtrlGetBatteryInfo(int port, SceUInt8 *batt); /** * Sets intercept * * If true, allows the current thread to intercept controls. The use case * might be, for example, a game plugin that wishes to capture input without * having the input sent to the game thread. * @param[in] intercept Boolean value * * @return 0, < 0 on error */ int sceCtrlSetButtonIntercept(int intercept); /** * Gets intercept * * @param[out] intercept Boolean value * * @return 0, < 0 on error */ int sceCtrlGetButtonIntercept(int *intercept); #ifdef __cplusplus } #endif #endif /* _PSP2CTRL_H_ */