/* SIE CONFIDENTIAL
 * $PSLibId$
 * Copyright (C) 2019 Sony Interactive Entertainment Inc.
 * All Rights Reserved.
 */


#ifndef _SCE_PAD_TRIGGER_EFFECT_H
#define _SCE_PAD_TRIGGER_EFFECT_H


#define SCE_PAD_TRIGGER_EFFECT_TRIGGER_MASK_L2			0x01
#define SCE_PAD_TRIGGER_EFFECT_TRIGGER_MASK_R2			0x02

#define SCE_PAD_TRIGGER_EFFECT_PARAM_INDEX_FOR_L2		0
#define SCE_PAD_TRIGGER_EFFECT_PARAM_INDEX_FOR_R2		1

#define SCE_PAD_TRIGGER_EFFECT_TRIGGER_NUM				2

/* Definition of control point num */
#define SCE_PAD_TRIGGER_EFFECT_CONTROL_POINT_NUM		10

typedef enum ScePadTriggerEffectMode{
	SCE_PAD_TRIGGER_EFFECT_MODE_OFF,
	SCE_PAD_TRIGGER_EFFECT_MODE_FEEDBACK,
	SCE_PAD_TRIGGER_EFFECT_MODE_WEAPON,
	SCE_PAD_TRIGGER_EFFECT_MODE_VIBRATION,
	SCE_PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_FEEDBACK,
	SCE_PAD_TRIGGER_EFFECT_MODE_SLOPE_FEEDBACK,
	SCE_PAD_TRIGGER_EFFECT_MODE_MULTIPLE_POSITION_VIBRATION,
} ScePadTriggerEffectMode;

/**
 *E  
 *  @brief parameter for setting the trigger effect to off mode.
 *         Off Mode: Stop trigger effect.
 **/
typedef struct ScePadTriggerEffectOffParam{
	uint8_t padding[48];
} ScePadTriggerEffectOffParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect to Feedback mode.
 *         Feedback Mode: The motor arm pushes back trigger.
 *                        Trigger obtains stiffness at specified position.
 **/
typedef struct ScePadTriggerEffectFeedbackParam{
	uint8_t position;	/*E position where the strength of target trigger start changing(0~9). */
	uint8_t strength;	/*E strength that the motor arm pushes back target trigger(0~8 (0: Same as Off mode)). */
	uint8_t padding[46];
} ScePadTriggerEffectFeedbackParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect to Weapon mode.
 *         Weapon Mode: Emulate weapon like gun trigger.
 **/
typedef struct ScePadTriggerEffectWeaponParam{
	uint8_t startPosition;	/*E position where the stiffness of trigger start changing(2~7). */
	uint8_t endPosition;	/*E position where the stiffness of trigger finish changing(startPosition+1~8). */
	uint8_t strength;		/*E strength of gun trigger(0~8 (0: Same as Off mode)). */
	uint8_t padding[45];
} ScePadTriggerEffectWeaponParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect to Vibration mode.
 *         Vibration Mode: Vibrates motor arm around specified position.
 **/
typedef struct ScePadTriggerEffectVibrationParam{
	uint8_t position;	/*E position where the motor arm start vibrating(0~9). */
	uint8_t amplitude;	/*E vibration amplitude(0~8 (0: Same as Off mode)). */
	uint8_t frequency;	/*E vibration frequency(0~255[Hz] (0: Same as Off mode)). */
	uint8_t padding[45];
} ScePadTriggerEffectVibrationParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect to ScePadTriggerEffectMultiplePositionFeedbackParam mode.
 *         Multi Position Feedback Mode: The motor arm pushes back trigger.
 *                                       Trigger obtains specified stiffness at each control point.
 **/
typedef struct ScePadTriggerEffectMultiplePositionFeedbackParam{
	uint8_t strength[SCE_PAD_TRIGGER_EFFECT_CONTROL_POINT_NUM];	/*E strength that the motor arm pushes back target trigger at position(0~8 (0: Same as Off mode)).
																 *  strength[0] means strength of motor arm at position0.
																 *  strength[1] means strength of motor arm at position1.
																 *  ...
																 * */
	uint8_t padding[38];
} ScePadTriggerEffectMultiplePositionFeedbackParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect to Feedback3 mode.
 *         Slope Feedback Mode: The motor arm pushes back trigger between two spedified control points.
 *                              Stiffness of the trigger is changing depending on the set place.
 **/
typedef struct ScePadTriggerEffectSlopeFeedbackParam{

	uint8_t startPosition;	/*E position where the strength of target trigger start changing(0~endPosition). */
	uint8_t endPosition; 	/*E position where the strength of target trigger finish changing(startPosition+1~9). */
	uint8_t startStrength;	/*E strength when trigger's position is startPosition(1~8) */
	uint8_t endStrength;	/*E strength when trigger's position is endPosition(1~8) */
	uint8_t padding[44];
} ScePadTriggerEffectSlopeFeedbackParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect to Vibration2 mode.
 *         Multi Position Vibration Mode: Vibrates motor arm around specified control point.
 *                                        Trigger vibrates specified amplitude at each control point.
 **/
typedef struct ScePadTriggerEffectMultiplePositionVibrationParam{
	uint8_t frequency;												/*E vibration frequency(0~255 (0: Same as Off mode)) */
	uint8_t amplitude[SCE_PAD_TRIGGER_EFFECT_CONTROL_POINT_NUM];	/*E vibration amplitude at position(0~8 (0: Same as Off mode)).
																	 *  amplitude[0] means amplitude of vibration at position0.
																	 *  amplitude[1] means amplitude of vibration at position1.
																	 *  ...
																	 * */
	uint8_t padding[37];
} ScePadTriggerEffectMultiplePositionVibrationParam;

/**
 *E  
 *  @brief parameter for setting the trigger effect mode.
 **/
typedef union ScePadTriggerEffectCommandData{
	ScePadTriggerEffectOffParam							offParam;
	ScePadTriggerEffectFeedbackParam					feedbackParam;
	ScePadTriggerEffectWeaponParam						weaponParam;
	ScePadTriggerEffectVibrationParam					vibrationParam;
	ScePadTriggerEffectMultiplePositionFeedbackParam	multiplePositionFeedbackParam;
	ScePadTriggerEffectSlopeFeedbackParam				slopeFeedbackParam;
	ScePadTriggerEffectMultiplePositionVibrationParam	multiplePositionVibrationParam;
} ScePadTriggerEffectCommandData;

/**
 *E  
 *  @brief parameter for setting the trigger effect.
 **/
typedef struct ScePadTriggerEffectCommand{
	ScePadTriggerEffectMode mode;
	uint8_t padding[4];
	ScePadTriggerEffectCommandData commandData;
} ScePadTriggerEffectCommand;

/**
 *E  
 *  @brief parameter for the scePadSetTriggerEffect function.
 **/
typedef struct ScePadTriggerEffectParam{

	uint8_t triggerMask;		/*E Set trigger mask to activate trigger effect commands.
								 *  SCE_PAD_TRIGGER_EFFECT_TRIGGER_MASK_L2 : 0x01
								 *  SCE_PAD_TRIGGER_EFFECT_TRIGGER_MASK_R2 : 0x02
								 * */
	uint8_t padding[7];

	ScePadTriggerEffectCommand command[SCE_PAD_TRIGGER_EFFECT_TRIGGER_NUM];	/*E command[SCE_PAD_TRIGGER_EFFECT_PARAM_INDEX_FOR_L2] is for L2 trigger setting
																			 *  and param[SCE_PAD_TRIGGER_EFFECT_PARAM_INDEX_FOR_R2] is for R2 trgger setting.
																			 * */
} ScePadTriggerEffectParam;

#if defined(__cplusplus) && __cplusplus >= 201103L
static_assert( sizeof( ScePadTriggerEffectParam ) == 120, "ScePadTriggerEffectParam has incorrect size" );
#endif

#endif /* _SCE_PAD_TRIGGER_EFFECT_H */