1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#ifndef _HID_H
#define _HID_H
#include <stdio.h>
#include <sys/syslog.h>
#ifdef __linux__
#include <linux/types.h>
#endif /* __linux__ */
#include <m_pd.h>
/*
* this is automatically generated from linux/input.h by
* make-arrays-from-input.h.pl to be the cross-platform event types and codes
*/
#include "input_arrays.h"
#define HID_MAJOR_VERSION 0
#define HID_MINOR_VERSION 7
/* static char *version = "$Revision: 1.28 $"; */
/*------------------------------------------------------------------------------
* GLOBAL DEFINES
*/
#define DEFAULT_DELAY 5
/* this is set to simplify data structures (arrays instead of linked lists) */
#define MAX_DEVICES 128
/* think 64 is the limit per device as defined in the OS */
#define MAX_ELEMENTS 64
/* this is limited so that the object doesn't cause a click getting too many
* events from the OS's event queue */
#define MAX_EVENTS_PER_POLL 64
/*------------------------------------------------------------------------------
* CLASS DEF
*/
typedef struct _hid
{
t_object x_obj;
t_int x_fd;
void *x_ff_device;
short x_device_number;
short x_instance;
t_int x_has_ff;
t_int x_started;
t_int x_device_open;
t_int x_delay;
t_clock *x_clock;
t_outlet *x_data_outlet;
t_outlet *x_status_outlet;
} t_hid;
/*------------------------------------------------------------------------------
* GLOBAL VARIABLES
*/
/* count the number of instances of this object so that certain free()
* functions can be called only after the final instance is detroyed.
*/
t_int hid_instance_count;
/* this is used to test for the first instance to execute */
double last_execute_time[MAX_DEVICES];
extern unsigned short global_debug_level;
/* built up when the elements of an open device are enumerated */
typedef struct _hid_element
{
#ifdef __linux__
/* GNU/Linux store type and code to compare against */
__u16 linux_type;
__u16 linux_code;
#else
void *os_pointer; // pRecElement on Mac OS X; ... on Windows
#endif /* __linux__ */
t_symbol *type; // Linux "type"; HID "usagePage"
t_symbol *name; // Linux "code"; HID "usage"
unsigned char polled; // is it polled or queued? (maybe only on Mac OS X?)
unsigned char relative; // relative data gets output everytime
t_int min; // from device report
t_int max; // from device report
t_float instance; // usage page/usage instance # ([absolute throttle 2 163(
t_int value; // output the sum of events in a poll for relative axes
t_int previous_value; //only output on change on abs and buttons
} t_hid_element;
/* mostly for status querying */
unsigned short device_count;
/* store element structs to eliminate symbol table lookups, etc. */
t_hid_element *element[MAX_DEVICES][MAX_ELEMENTS];
/* number of active elements per device */
unsigned short element_count[MAX_DEVICES];
/*------------------------------------------------------------------------------
* FUNCTION PROTOTYPES FOR DIFFERENT PLATFORMS
*/
/* support functions */
void debug_print(t_int debug_level, const char *fmt, ...);
void debug_error(t_hid *x, t_int debug_level, const char *fmt, ...);
void hid_output_event(t_hid *x, t_hid_element *output_data);
/* the old way
void hid_output_event(t_hid *x, t_symbol *type, t_symbol *code, t_float value);
*/
/* generic, cross-platform functions implemented in a separate file for each
* platform
*/
t_int hid_open_device(t_hid *x, short device_number);
t_int hid_close_device(t_hid *x);
void hid_build_device_list(void);
void hid_get_events(t_hid *x);
void hid_print(t_hid* x); /* print info to the console */
void hid_platform_specific_info(t_hid* x); /* device info on the status outlet */
void hid_platform_specific_free(t_hid *x);
short get_device_number_by_id(unsigned short vendor_id, unsigned short product_id);
short get_device_number_from_usage(short device_number,
unsigned short usage_page,
unsigned short usage);
/* cross-platform force feedback functions */
t_int hid_ff_autocenter(t_hid *x, t_float value);
t_int hid_ff_gain(t_hid *x, t_float value);
t_int hid_ff_motors(t_hid *x, t_float value);
t_int hid_ff_continue(t_hid *x);
t_int hid_ff_pause(t_hid *x);
t_int hid_ff_reset(t_hid *x);
t_int hid_ff_stopall(t_hid *x);
// these are just for testing...
t_int hid_ff_fftest (t_hid *x, t_float value);
void hid_ff_print(t_hid *x);
#endif /* #ifndef _HID_H */
|