/*----------------------------------------------------------------------------
  ChucK Concurrent, On-the-fly Audio Programming Language
    Compiler and Virtual Machine

  Copyright (c) 2004 Ge Wang and Perry R. Cook.  All rights reserved.
    http://chuck.stanford.edu/
    http://chuck.cs.princeton.edu/

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  U.S.A.
-----------------------------------------------------------------------------*/

//-----------------------------------------------------------------------------
// file: util_hid.h
// desc: header file for joystick/mouse/keyboard support
//
// author: Spencer Salazar (spencer@ccrma.stanford.edu)
// date: spring 2006
//-----------------------------------------------------------------------------
#ifndef __UTIL_HID_H__
#define __UTIL_HID_H__




//-----------------------------------------------------------------------------
// definitions
//-----------------------------------------------------------------------------
struct HidMsg
{
    t_CKINT device_type; // device type
    t_CKINT device_num;  // device number
    t_CKINT type;        // message type
    t_CKINT eid;         // element id
#ifdef _WIN64 // REFACTOR-2017
    long idata[4];       // int data (code using this expects a "long" rather than a "t_CKINT")
#else
    t_CKINT idata[4];    // int data
#endif
    t_CKFLOAT fdata[4];  // float data
    
#ifdef __cplusplus
    HidMsg()
    { this->clear(); }

    void clear()
    {
        memset( this, 0, sizeof(HidMsg) );
    }
#endif
};




/* device types */
extern const t_CKUINT CK_HID_DEV_NONE;
extern const t_CKUINT CK_HID_DEV_JOYSTICK;
extern const t_CKUINT CK_HID_DEV_MOUSE;
extern const t_CKUINT CK_HID_DEV_KEYBOARD;
extern const t_CKUINT CK_HID_DEV_WIIREMOTE;
extern const t_CKUINT CK_HID_DEV_TILTSENSOR;
extern const t_CKUINT CK_HID_DEV_TABLET;
extern const t_CKUINT CK_HID_DEV_MULTITOUCH;
extern const t_CKUINT CK_HID_DEV_COUNT;

/* message types */
extern const t_CKUINT CK_HID_JOYSTICK_AXIS;
extern const t_CKUINT CK_HID_BUTTON_DOWN;
extern const t_CKUINT CK_HID_BUTTON_UP;
extern const t_CKUINT CK_HID_JOYSTICK_HAT;
extern const t_CKUINT CK_HID_JOYSTICK_BALL;
extern const t_CKUINT CK_HID_MOUSE_MOTION;
extern const t_CKUINT CK_HID_MOUSE_WHEEL;
extern const t_CKUINT CK_HID_DEVICE_CONNECTED;
extern const t_CKUINT CK_HID_DEVICE_DISCONNECTED;
extern const t_CKUINT CK_HID_ACCELEROMETER;
extern const t_CKUINT CK_HID_WIIREMOTE_IR;
extern const t_CKUINT CK_HID_LED;
extern const t_CKUINT CK_HID_FORCE_FEEDBACK;
extern const t_CKUINT CK_HID_SPEAKER;
extern const t_CKUINT CK_HID_TABLET_PRESSURE;
extern const t_CKUINT CK_HID_TABLET_MOTION;
extern const t_CKUINT CK_HID_TABLET_ROTATION;
extern const t_CKUINT CK_HID_MULTITOUCH_TOUCH;
extern const t_CKUINT CK_HID_MSG_COUNT;

/* keys */

/* extension API */

enum HidResult
{
    HID_GENERALERROR = -1,
    HID_NOERROR = 0,
};

struct _Chuck_Hid_Driver
{
    void ( *init )();
    void ( *quit )();
    void ( *poll )();
    void ( *probe )();
    int ( *count )();
    int ( *count_elements )( int, int );
    int ( *open )( int );
    int ( *open_async )( int );
    int ( *close )( int );
    int ( *send )( int, const HidMsg * );
    int ( *read )( int, int, int, HidMsg * );
    const char * ( *name )( int );
    const char * driver_name;
};
typedef struct _Chuck_Hid_Driver Chuck_Hid_Driver;

/* functions */
extern void Hid_init();
extern void Hid_poll();
extern void Hid_quit();

extern void Joystick_init();
extern void Joystick_poll();
extern void Joystick_quit();
extern void Joystick_probe();
extern int Joystick_count();
extern int Joystick_count_elements( int js, int type );
extern int Joystick_open( int js );
extern int Joystick_open_async( int js );
extern int Joystick_open( const char * name );
extern int Joystick_close( int js );
extern int Joystick_send( int js, const HidMsg * msg );
extern const char * Joystick_name( int js );

extern int Joystick_axes( int js );
extern int Joystick_buttons( int js );
extern int Joystick_hats( int js );

extern void Mouse_init();
extern void Mouse_poll();
extern void Mouse_quit();
extern void Mouse_probe();
extern int Mouse_count();
extern int Mouse_count_elements( int js, int type );
extern int Mouse_open( int m );
extern int Mouse_open( const char * name );
extern int Mouse_close( int m );
extern int Mouse_send( int m, const HidMsg * msg );
extern const char * Mouse_name( int m );
extern int Mouse_buttons( int m );
extern int Mouse_start_cursor_track();
extern int Mouse_stop_cursor_track();
    
extern void Keyboard_init();
extern void Keyboard_poll();
extern void Keyboard_quit();
extern void Keyboard_probe();
extern int Keyboard_count();
extern int Keyboard_count_elements( int js, int type );
extern int Keyboard_open( int kb );
extern int Keyboard_open( const char * name );
extern int Keyboard_close( int kb );
extern int Keyboard_send( int kb, const HidMsg * msg );
extern const char * Keyboard_name( int kb );

extern void WiiRemote_init();
extern void WiiRemote_poll();
extern void WiiRemote_quit();
extern void WiiRemote_probe();
extern int WiiRemote_count();
extern int WiiRemote_open( int wr );
extern int WiiRemote_open( const char * name );
extern int WiiRemote_close( int wr );
extern int WiiRemote_send( int wr, const HidMsg * msg );
extern const char * WiiRemote_name( int wr );

extern void TiltSensor_init();
extern void TiltSensor_quit();
extern void TiltSensor_probe();
extern int TiltSensor_count();
extern int TiltSensor_open( int ts );
extern int TiltSensor_close( int ts );
extern int TiltSensor_read( int ts, int type, int num, HidMsg * msg );
extern const char * TiltSensor_name( int ts );
// ge: SMS multi-thread poll rate
t_CKINT TiltSensor_setPollRate( t_CKINT usec );
t_CKINT TiltSensor_getPollRate( );


extern void MultiTouchDevice_init();
extern void MultiTouchDevice_quit();
extern void MultiTouchDevice_probe();
extern int MultiTouchDevice_count();
extern int MultiTouchDevice_open( int ts );
extern int MultiTouchDevice_close( int ts );
extern const char * MultiTouchDevice_name( int ts );


extern void Tablet_init();
extern void Tablet_quit();
extern void Tablet_probe();
extern int Tablet_count();
extern int Tablet_open( int ts );
extern int Tablet_close( int ts );
extern const char * Tablet_name( int ts );




#endif
