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 -- Access

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

	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)

	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

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

	Game_library: GAME_LIBRARY_CONTROLLER
			-- The main controller of the game library
			-- (from GAME_LIBRARY_SHARED)

	generating_type: TYPE [detachable GAME_HAPTIC]
			-- Type of current object
			-- (type of which it is a direct instance)
			-- (from ANY)
		ensure -- from ANY
			generating_type_not_void: Result /= Void

	generator: STRING_8
			-- Name of current object's generating class
			-- (base class of the type of which it is a direct instance)
			-- (from ANY)
		ensure -- from ANY
			generator_not_void: Result /= Void
			generator_not_empty: not Result.is_empty

	has_error: BOOLEAN
			-- Is the library has generate an error
			-- (from GAME_ERROR_MANAGER)

	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

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

	last_error: READABLE_STRING_GENERAL
			-- The last error generate by the library
			-- (from GAME_SDL_ANY)

	open
			-- Make Current usable
		require
			not_open: not is_open
		ensure
			is_open: not has_error implies 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

	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

	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
	
feature -- Comparison

	frozen deep_equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void
			-- or attached to isomorphic object structures?
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			shallow_implies_deep: standard_equal (a, b) implies Result
			both_or_none_void: (a = Void) implies (Result = (b = Void))
			same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b))
			symmetric: Result implies deep_equal (b, a)

	frozen equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void or attached
			-- to objects considered equal?
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.is_equal (b))

	frozen is_deep_equal alias "≡≡≡" (other: GAME_HAPTIC): BOOLEAN
			-- Are Current and other attached to isomorphic object structures?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			shallow_implies_deep: standard_is_equal (other) implies Result
			same_type: Result implies same_type (other)
			symmetric: Result implies other.is_deep_equal (Current)

	is_equal (other: GAME_HAPTIC): BOOLEAN
			-- Is other attached to an object considered
			-- equal to current object?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			symmetric: Result implies other ~ Current
			consistent: standard_is_equal (other) implies Result

	frozen standard_equal (a: detachable ANY; b: like arg #1): BOOLEAN
			-- Are a and b either both void or attached to
			-- field-by-field identical objects of the same type?
			-- Always uses default object comparison criterion.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.standard_is_equal (b))

	frozen standard_is_equal alias "" (other: GAME_HAPTIC): BOOLEAN
			-- Is other attached to an object of the same type
			-- as current object, and field-by-field identical to it?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			same_type: Result implies same_type (other)
			symmetric: Result implies other.standard_is_equal (Current)
	
feature -- Status report

	conforms_to (other: ANY): BOOLEAN
			-- Does type of current object conform to type
			-- of other (as per Eiffel: The Language, chapter 13)?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void

	same_type (other: ANY): BOOLEAN
			-- Is type of current object identical to type of other?
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			definition: Result = (conforms_to (other) and other.conforms_to (Current))
	
feature -- Duplication

	copy (other: GAME_HAPTIC)
			-- Update current object using fields of object attached
			-- to other, so as to yield equal objects.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_equal: Current ~ other

	frozen deep_copy (other: GAME_HAPTIC)
			-- Effect equivalent to that of:
			--		copy (other . deep_twin)
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
		ensure -- from ANY
			deep_equal: deep_equal (Current, other)

	frozen deep_twin: GAME_HAPTIC
			-- New object structure recursively duplicated from Current.
			-- (from ANY)
		ensure -- from ANY
			deep_twin_not_void: Result /= Void
			deep_equal: deep_equal (Current, Result)

	frozen standard_copy (other: GAME_HAPTIC)
			-- Copy every field of other onto corresponding field
			-- of current object.
			-- (from ANY)
		require -- from ANY
			other_not_void: other /= Void
			type_identity: same_type (other)
		ensure -- from ANY
			is_standard_equal: standard_is_equal (other)

	frozen standard_twin: GAME_HAPTIC
			-- New object field-by-field identical to other.
			-- Always uses default copying semantics.
			-- (from ANY)
		ensure -- from ANY
			standard_twin_not_void: Result /= Void
			equal: standard_equal (Result, Current)

	frozen twin: GAME_HAPTIC
			-- New object equal to Current
			-- twin calls copy; to change copying/twinning semantics, redefine copy.
			-- (from ANY)
		ensure -- from ANY
			twin_not_void: Result /= Void
			is_equal: Result ~ Current
	
feature -- Basic operations

	frozen default: detachable GAME_HAPTIC
			-- Default value of object's type
			-- (from ANY)

	frozen default_pointer: POINTER
			-- Default value of type POINTER
			-- (Avoid the need to write p.default for
			-- some p of type POINTER.)
			-- (from ANY)
		ensure -- from ANY
			instance_free: class

	default_rescue
			-- Process exception for routines with no Rescue clause.
			-- (Default: do nothing.)
			-- (from ANY)

	frozen do_nothing
			-- Execute a null action.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
	
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.
	
feature -- Output

	Io: STD_FILES
			-- Handle to standard file setup
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			io_not_void: Result /= Void

	out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- (from ANY)
		ensure -- from ANY
			out_not_void: Result /= Void

	print (o: detachable ANY)
			-- Write terse external representation of o
			-- on standard output.
			-- (from ANY)
		ensure -- from ANY
			instance_free: class

	frozen tagged_out: STRING_8
			-- New string containing terse printable representation
			-- of current object
			-- (from ANY)
		ensure -- from ANY
			tagged_out_not_void: Result /= Void
	
feature -- Platform

	Operating_environment: OPERATING_ENVIRONMENT
			-- Objects available from the operating system
			-- (from ANY)
		ensure -- from ANY
			instance_free: class
			operating_environment_not_void: Result /= Void
	
feature -- Query

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

	is_auto_center_supported: BOOLEAN
			-- Is Current supported the auto center feature
		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_friction_effect_supported: BOOLEAN
			-- Is Current supported conditionnal effect base on axis movement
		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_spring_effect_supported: BOOLEAN
			-- Is Current supported conditionnal effect base on axis position
		require
			is_open: is_open

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

	is_custom_effect_supported: BOOLEAN
			-- Is Current supported custom effect
		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

	is_gain_control_supported: BOOLEAN
			-- Is Current supported gain control
		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_linear_ramp_effect_supported: BOOLEAN
			-- Is Current supported linear ramp effect
		require
			is_open: is_open

	is_open: BOOLEAN
			-- Is Current currently usable

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

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

	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_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_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_rumble: BOOLEAN
			-- Is Current initialized as a rumble playback

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

	is_status_query_supported: BOOLEAN
			-- Is Current supported the query of effect status
		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
	
invariant
	is_haptic_enabled: Game_library.is_haptic_enable

		-- from ANY
	reflexive_equality: standard_is_equal (Current)
	reflexive_conformance: conforms_to (Current)

end -- class GAME_HAPTIC

Generated by ISE EiffelStudio