note
	description: "Information and control of force feedback devices"
	author: "Louis Marchand"
	date: "Sat, 28 Feb 2015 19:20:47 +0000"
	revision: "2.0"

deferred class interface
	GAME_HAPTIC

feature -- Query

	is_open: BOOLEAN
			-- Is Current currently usable

	is_constant_effect_supported: BOOLEAN
			-- Is Current supported constant effect
		require
			is_open: is_open

	is_periodic_sine_effect_supported: BOOLEAN
			-- Is Current supported periodic sine effect
			--   __      __      __      __
			--  /  \    /  \    /  \    /
			-- /    \__/    \__/    \__/
		require
			is_open: is_open

	is_periodic_triangle_effect_supported: BOOLEAN
			-- Is Current supported periodic triangle effect
			--   /\    /\    /\    /\    /\
			--  /  \  /  \  /  \  /  \  /
			-- /    \/    \/    \/    \/
		require
			is_open: is_open

	is_periodic_saw_tooth_up_effect_supported: BOOLEAN
			-- Is Current supported periodic effect of the type
			-- sawtooth with the openning at the bottom.
			--   /|  /|  /|  /|  /|  /|  /|
			--  / | / | / | / | / | / | / |
			-- /  |/  |/  |/  |/  |/  |/  |
		require
			is_open: is_open

	is_periodic_saw_tooth_down_effect_supported: BOOLEAN
			-- Is Current supported periodic effect of the type
			-- sawtooth with the openning at the top.
			-- \  |\  |\  |\  |\  |\  |\  |
			--  \ | \ | \ | \ | \ | \ | \ |
			--   \|  \|  \|  \|  \|  \|  \|
		require
			is_open: is_open

	is_linear_ramp_effect_supported: BOOLEAN
			-- Is Current supported linear ramp effect
		require
			is_open: is_open

	is_conditionnal_spring_effect_supported: BOOLEAN
			-- Is Current supported conditionnal effect base on axis position
		require
			is_open: is_open

	is_conditionnal_damper_effect_supported: BOOLEAN
			-- Is Current supported conditionnal effect base on axis velocities
		require
			is_open: is_open

	is_conditionnal_inertia_effect_supported: BOOLEAN
			-- Is Current supported conditionnal effect base on axis acceleration
		require
			is_open: is_open

	is_conditionnal_friction_effect_supported: BOOLEAN
			-- Is Current supported conditionnal effect base on axis movement
		require
			is_open: is_open

	is_left_right_effect_supported: BOOLEAN
			-- Is Current supported left/right effect
			-- Used in lots of recent console controller
		require
			is_open: is_open

	is_custom_effect_supported: BOOLEAN
			-- Is Current supported custom effect
		require
			is_open: is_open

	is_gain_control_supported: BOOLEAN
			-- Is Current supported gain control
		require
			is_open: is_open

	is_auto_center_supported: BOOLEAN
			-- Is Current supported the auto center feature
		require
			is_open: is_open

	is_status_query_supported: BOOLEAN
			-- Is Current supported the query of effect status
		require
			is_open: is_open

	is_pause_supported: BOOLEAN
			-- Is Current supported the pause of an effect
		require
			is_open: is_open

	is_rumble_supported: BOOLEAN
			-- Can Current be used as a simple rumble playback
		require
			is_open: is_open

	is_paused: BOOLEAN
			-- Has Current presently stop with a pause.

	is_rumble: BOOLEAN
			-- Is Current initialized as a rumble playback

	axes_count: INTEGER_32
			-- The number of axes of Current
		require
			is_open: is_open

	maximum_effect_compiled: INTEGER_32
			-- The maximum number of effect that Current can compiled and store
			-- Note that on some system, tis information is not given, so this
			-- may be a simple approximation
		require
			is_open: is_open

	maximum_effect_playing: INTEGER_32
			-- The maximum number of effect that Current can play at the same time
			-- Note that on some system, tis information is not given, so this
			-- may be a simple approximation
		require
			is_open: is_open

	is_effect_supported (a_effect: GAME_HAPTIC_EFFECT): BOOLEAN
			-- Is a_effect can be compiled by Current
		require
				is_open
	
feature -- Access

	open
			-- Make Current usable
		require
			not_open: not is_open
		ensure
			is_open: not has_error implies is_open

	close
			-- Make Current not usable
		require
			is_open: is_open
		ensure
			is_close: not is_open

	pause
			-- Mommentaly stop the playing effect. Use resume to restart it
			-- where it was when paused.
		require
			is_open: is_open
			pause_supported: is_pause_supported
			not_paused: not is_paused
		ensure
			is_paused: not has_error implies is_paused

	resume
			-- Restart an effect that has been pause before.
		require
			is_open: is_open
			pause_supported: is_pause_supported
			is_paused: is_paused
		ensure
			in_unpaused: not has_error implies not is_paused

	initialize_rumble
			-- Initialized a rumble playback into Current
		require
			is_open: is_open
			rumble_supported: is_rumble_supported
			not_already_rumble: not is_rumble
		ensure
			is_rumble_activated: not has_error implies is_rumble

	rumble_play (a_strength: REAL_32; a_length: NATURAL_32)
			-- Start a rumble playback with a magnitude of a_strength
			-- and a duration a_length in millisecond
		require
			is_open: is_open
			rumble_supported: is_rumble_supported
			is_rumble_device: is_rumble
			strength_is_valid: a_strength >= 0.to_real and a_strength <= 1.to_real

	rumble_play_infinite_length (a_strength: REAL_32)
			-- Start a rumble playbacki with a magnitude of a_strength
			-- and never stop (use rumble_stop to stop)
		require
			is_open: is_open
			rumble_supported: is_rumble_supported
			is_rumble_device: is_rumble
			strength_is_valid: a_strength >= 0.to_real and a_strength <= 1.to_real

	rumble_stop
			-- Stop a rumble playback
		require
			is_open: is_open
			rumble_supported: is_rumble_supported
			is_rumble_device: is_rumble

	gain: INTEGER_32 assign set_gain
			-- The intensity of Current
		require
			gain_control_supported: is_gain_control_supported

	set_gain (a_gain: INTEGER_32)
			-- Assign to gain the value of a_gain
		require
			is_open: is_open
			gain_control_supported: is_gain_control_supported
		ensure
			is_assign: not has_error implies gain = a_gain

	stop_all_effects
			-- Stop every effect on Current
		require
			is_open: is_open

	compiled_effect_count: INTEGER_32
			-- Number of compiled_effects in Current

	compiled_effects: CHAIN_INDEXABLE_ITERATOR [GAME_HAPTIC_EFFECT_COMPILED]
			-- Every compiled effect into Current

	compile (a_effect: GAME_HAPTIC_EFFECT)
			-- Create a new compiled effect and store it in the compiled_effects
			-- list. You can get ot quicker by using last_compiled_effect
		require
			current_valid: is_open
			effect_valid: a_effect.exists
			effect_supported: is_effect_supported (a_effect)
		ensure
			is_count_valid: not has_error implies (compiled_effect_count = compiled_effect_count + 1)
			is_count_not_null: not has_error implies (compiled_effect_count > 0)
			last_compiled_valid: not has_error implies (last_compiled_effect.is_open and last_compiled_effect.haptic = Current and last_compiled_effect.effect = a_effect)

	last_compiled_effect: GAME_HAPTIC_EFFECT_COMPILED
			-- Last compiled effect that has been compiled with compile
		require
			element_exist: compiled_effect_count > 0
	
feature -- Implementation

	dispose
			-- Action to be executed just before garbage collection
			-- reclaims an object.
			-- Effect it in descendants to perform specific dispose
			-- actions. Those actions should only take care of freeing
			-- external resources; they should not perform remote calls
			-- on other objects since these may also be dead and reclaimed.
	
invariant
	is_haptic_enabled: Game_library.is_haptic_enable

end -- class GAME_HAPTIC

Generated by ISE EiffelStudio