/* * $Logfile: /DescentIII/Main/lib/Controller.h $ * $Revision: 21 $ * $Date: 3/20/00 12:25p $ * $Author: Matt $ * * Universal controller header * * $Log: /DescentIII/Main/lib/Controller.h $ * * 21 3/20/00 12:25p Matt * Merge of Duane's post-1.3 changes. * Added declaration. * * 20 8/11/99 6:06p Samir * added flag to determine whether packet contained mouse info. * * 19 7/20/99 4:53p Samir * added ability to manually set the deadzone for a controller. * * 18 7/16/99 11:14a Samir * multiple hat support and improved direct input support. * * 17 4/29/99 2:23a Samir * moved binding text functions to wincontroller.cpp and new text for * multiple joysticks. * * 16 4/16/99 7:34p Jeff * added linux controller * * 15 2/16/99 11:59a Samir * added proper constants for controller and binding null values. * * 14 12/18/98 6:00p Samir * added enable_function. * * 13 10/24/98 2:18p Samir * added mouse and joytick raw value retrieval functions. * * 12 10/21/98 10:36a Samir * added code to turn on or off joystick or mouse. * * 11 10/18/98 7:29p Samir * made assign_function public. * * 10 10/17/98 7:31p Samir * added invertible axes * * 9 9/10/98 12:39p Samir * added senstivity issures for controller. * * 8 6/18/98 4:48p Samir * added changes for multiple configs for joystick controls. * * 7 5/15/98 3:13p Samir * added 2 key support for controller functions. * * 6 2/24/98 11:03a Samir * Added flush function to controller system. * * 5 2/16/98 3:04p Samir * ctAxis instead of ctXAxis, ctYAxis, etc. * * 4 2/13/98 6:38p Samir * Added get and set controller function. * * 3 12/03/97 7:35p Samir * Newer joystick library support and some POV. * * 2 10/29/97 4:44p Samir * Added ctDownCount format. * * 8 5/21/97 3:51p Samir * changed ct_need to ct_function * * 7 5/12/97 4:39 PM Jeremy * #include of macController.h on Macintosh * * 6 5/12/97 1:21p Samir * Added suspend and resume functions. * * 5 4/23/97 1:07p Samir * Now we can poll for either positonal or evaluator data. * * 4 4/16/97 1:04p Samir * For get packet, allow one to return an alternate format value if that * function supports it. * * 3 4/16/97 12:27p Samir * Added mouse support. * * 2 4/11/97 2:13p Samir * Universal header for control system. first version * * $NoKeywords: $ */ #ifndef CONTROLLER_H #define CONTROLLER_H #include "pstypes.h" #include "Macros.h" typedef enum ct_format { ctNoFormat, ctAnalog, // analog information (-1.0 to 1.0) ctDigital, // digital information (0 or 1) ctDownCount, // special information for key presses and button/mouse presses. ctTime // time in seconds format } ct_format; typedef enum ct_type { ctNone, ctAxis, // axis element of controller. ctPOV, // function value (hiword = +axis, loword = -axis) ctButton, // fn value: controller button # ctKey, // fn value: lobyte(key constant), hibyte(alternate key constant) ctMouseAxis, ctMouseButton, ctPOV2, ctPOV3, ctPOV4 // auxillary POV values. } ct_type; typedef struct ct_function { int id; // identifier for the function (like forward thrust) ct_format format; // what format should the return value be for this function ct_type ctype[2]; // type of controller requested for this id. (1 for each value packed.) ubyte value[2]; // corresponding value to ctype ubyte flags[2]; // flags. } ct_function; typedef struct ct_packet { ct_format format; // format of value. float value; // time value for buttons, absolute value for axis values unsigned flags; // additional information (see below) } ct_packet; typedef unsigned ct_config_data; // passed by controller system to the outside, and back to controller system // values for ct_packet.flags #define CTPK_ELEMENTACTIVE 0x1 // indicates element was activated but no time/analog information is available. #define CTPK_MOUSE 0x2 // this is coming from a mouse device. default is joystick/keyboard. // element values const ubyte CT_X_AXIS = 1, // AXIS constants for ctAxis CT_Y_AXIS = 2, CT_Z_AXIS = 3, CT_R_AXIS = 4, CT_U_AXIS = 5, CT_V_AXIS = 6, CT_NUM_AXES = 6; // number of axes // ct_function flags #define CTFNF_INVERT 0x1 // invert values returned via get_packet. #define NULL_BINDING 0x00 #define NULL_CONTROLLER 0xff #define INVALID_CONTROLLER_INFO 0xffff #define CONTROLLER_KEY1_VALUE(_b) lobyte(_b) #define CONTROLLER_KEY2_VALUE(_b) hibyte(_b) #define CONTROLLER_KEY_VALUE(_k1, _k2) makeshort(_k2, _k1) #define CONTROLLER_CTL1_VALUE(_b) CONTROLLER_KEY1_VALUE(_b) #define CONTROLLER_CTL2_VALUE(_b) CONTROLLER_KEY2_VALUE(_b) #define CONTROLLER_CTL_VALUE(_l, _h) makeshort(_h, _l) #define CONTROLLER_CTL1_INFO(_b) ((sbyte)lobyte(_b)) #define CONTROLLER_CTL2_INFO(_b) ((sbyte)hibyte(_b)) #define CONTROLLER_CTL_INFO(_l, _h) makeshort(_h, _l) #define CONTROLLER_VALUE(_l) ((ushort)loword(_l)) #define CONTROLLER_INFO(_l) ((short)hiword(_l)) #define MAKE_CONFIG_DATA(_c, _v) makeword(_c, _v) #define CTLBINDS_PER_FUNC 2 class gameController { public: gameController(int num_funcs, ct_function *funcs){}; virtual ~gameController(){}; // these functions suspend or resume any controller reading. this is really only useful for // preemptive controller polling, but they should be used to activate and deactivate controller // reading. virtual void suspend(){}; virtual void resume(){}; // this functions polls the controllers if needed. some systems may not need to implement // this function. virtual void poll(){}; // flushes all controller information virtual void flush() = 0; // returns the value of a requested controller type. make sure you flush the controller before polling. virtual ct_config_data get_controller_value(ct_type type_req) = 0; // sets the configuration of a function (type must be of an array == CTLBINDS_PER_FUNC) virtual void set_controller_function(int id, const ct_type *type, ct_config_data value, const ubyte *flags) = 0; // returns information about a requested function (type must be of an array == CTLBINDS_PER_FUNC) virtual void get_controller_function(int id, ct_type *type, ct_config_data *value, ubyte *flags) = 0; // temporarily enables or disables a function virtual void enable_function(int id, bool enable) = 0; // all systems need to implement this function. this returns information about the controller virtual bool get_packet(int id, ct_packet *packet, ct_format alt_format = ctNoFormat) = 0; // gets sensitivity of axis item virtual float get_axis_sensitivity(ct_type axis_type, ubyte axis) = 0; // sets sensitivity of axis item virtual void set_axis_sensitivity(ct_type axis_type, ubyte axis, float val) = 0; // assigns an individual function virtual int assign_function(ct_function *fn) = 0; // activates or deactivates mouse and or controller virtual void mask_controllers(bool joystick, bool mouse) = 0; // retrieves binding text for desired function, binding, etc. virtual const char *get_binding_text(ct_type type, ubyte ctrl, ubyte bind) = 0; // get raw values for the controllers virtual int get_mouse_raw_values(int *x, int *y) = 0; virtual unsigned get_joy_raw_values(int *x, int *y) = 0; // toggles use of deadzone for controllers. ctl can be 0 to ??? // dead zone is from 0.0 to 0.5 virtual void set_controller_deadzone(int ctl, float deadzone){}; virtual float get_controller_deadzone(int ctl) { return 0; }; // toggles use of axis on controllers. ctl can be 0 to ??? // axis is a CT_?_AXIS value void toggle_controller_axis(int ctl, int axis, bool toggle){}; }; gameController *CreateController(int num_funcs, ct_function *funcs, char *remote_ip); void DestroyController(gameController *ctl); #if defined(WIN32) #include "win\WinController.h" #elif defined(MACINTOSH) #include "macController.h" #elif defined(__LINUX__) #include "linux/lnxcontroller.h" #endif #endif