Update of /cvsroot/pure-data/externals/io/hidio
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9543
Modified Files:
hidio.c hidio.h hidio_darwin.c input_arrays.h
Log Message:
initial Max port for Max 4.5 on OS
Index: input_arrays.h
===================================================================
RCS file: /cvsroot/pure-data/externals/io/hidio/input_arrays.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** input_arrays.h 30 Nov 2006 05:53:40 -0000 1.1
--- input_arrays.h 1 Dec 2006 15:07:46 -0000 1.2
***************
*** 3,40 ****
! char *ev[32];
! char *ev_syn[512];
! char *ev_key[512];
! char *ev_rel[16];
! char *ev_abs[64];
! char *ev_msc[8];
! char *ev_led[16];
! char *ev_snd[8];
! char *ev_rep[2];
! char *ev_ff[128];
! char *ev_pwr[1];
! char *ev_ff_status[2];
! char *ev_5[16];
! char *ev_6[16];
! char *ev_7[16];
! char *ev_8[16];
! char *ev_9[16];
! char *ev_10[16];
! char *ev_11[16];
! char *ev_12[16];
! char *ev_13[16];
! char *ev_14[16];
! char *ev_15[16];
! char *ev_16[16];
! char *ev_19[16];
! char *ev_24[16];
! char *ev_25[16];
! char *ev_26[16];
! char *ev_27[16];
! char *ev_28[16];
! char *ev_29[16];
! char *ev_30[16];
! char *ev_31[16];
! char **event_names[32];
--- 3,40 ----
! extern char *ev[32];
! extern char *ev_syn[512];
! extern char *ev_key[512];
! extern char *ev_rel[16];
! extern char *ev_abs[64];
! extern char *ev_msc[8];
! extern char *ev_led[16];
! extern char *ev_snd[8];
! extern char *ev_rep[2];
! extern char *ev_ff[128];
! extern char *ev_pwr[1];
! extern char *ev_ff_status[2];
! extern char *ev_5[16];
! extern char *ev_6[16];
! extern char *ev_7[16];
! extern char *ev_8[16];
! extern char *ev_9[16];
! extern char *ev_10[16];
! extern char *ev_11[16];
! extern char *ev_12[16];
! extern char *ev_13[16];
! extern char *ev_14[16];
! extern char *ev_15[16];
! extern char *ev_16[16];
! extern char *ev_19[16];
! extern char *ev_24[16];
! extern char *ev_25[16];
! extern char *ev_26[16];
! extern char *ev_27[16];
! extern char *ev_28[16];
! extern char *ev_29[16];
! extern char *ev_30[16];
! extern char *ev_31[16];
! extern char **event_names[32];
Index: hidio_darwin.c
===================================================================
RCS file: /cvsroot/pure-data/externals/io/hidio/hidio_darwin.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** hidio_darwin.c 30 Nov 2006 05:53:40 -0000 1.1
--- hidio_darwin.c 1 Dec 2006 15:07:46 -0000 1.2
***************
*** 409,413 ****
pCurrentHIDElement->usage, usage_name);
! new_element = getbytes(sizeof(t_hid_element));
new_element->pHIDElement = (void *) pCurrentHIDElement;
get_usage_symbols(pCurrentHIDElement, new_element);
--- 409,413 ----
pCurrentHIDElement->usage, usage_name);
! new_element = (t_hid_element *)getbytes(sizeof(t_hid_element));
new_element->pHIDElement = (void *) pCurrentHIDElement;
get_usage_symbols(pCurrentHIDElement, new_element);
***************
*** 563,567 ****
char device_type_buffer[256];
t_symbol *output_symbol;
! t_atom *output_atom = getbytes(sizeof(t_atom));
if(x->x_device_number > -1)
--- 563,567 ----
char device_type_buffer[256];
t_symbol *output_symbol;
! t_atom *output_atom = (t_atom *)getbytes(sizeof(t_atom));
if(x->x_device_number > -1)
***************
*** 583,587 ****
--- 583,591 ----
{
output_symbol = gensym(pCurrentHIDDevice->serial);
+ #ifdef PD
if( output_symbol != &s_ )
+ #else
+ if( output_symbol != _sym_nothing )
+ #endif
{ /* the serial is rarely used on USB devices, so test for it */
SETSYMBOL(output_atom, output_symbol);
Index: hidio.h
===================================================================
RCS file: /cvsroot/pure-data/externals/io/hidio/hidio.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** hidio.h 30 Nov 2006 05:53:40 -0000 1.1
--- hidio.h 1 Dec 2006 15:07:46 -0000 1.2
***************
*** 9,13 ****
--- 9,28 ----
#endif /* __linux__ */
+ #ifdef PD
#include <m_pd.h>
+ #else
+ #include "ext.h"
+ #include "ext_obex.h"
+ #include "commonsyms.h"
+ /* some Pd specific types need definition in Max */
+ typedef long t_int;
+ typedef double t_float;
+ typedef double t_floatarg;
+ typedef void t_outlet;
+ typedef void t_clock;
+ #define MAXPDSTRING 512
+ #define pd_error(x, b) error(b)
+ #define SETSYMBOL SETSYM
+ #endif
/*
***************
*** 45,48 ****
--- 60,66 ----
{
t_object x_obj;
+ #ifndef PD
+ void *x_obex;
+ #endif
t_int x_fd;
void *x_ff_device;
***************
*** 67,74 ****
* functions can be called only after the final instance is detroyed.
*/
! t_int hidio_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;
--- 85,92 ----
* functions can be called only after the final instance is detroyed.
*/
! extern t_int hidio_instance_count;
/* this is used to test for the first instance to execute */
! extern double last_execute_time[MAX_DEVICES];
extern unsigned short global_debug_level;
***************
*** 100,109 ****
/* 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];
/*------------------------------------------------------------------------------
--- 118,127 ----
/* mostly for status querying */
! extern unsigned short device_count;
/* store element structs to eliminate symbol table lookups, etc. */
! extern t_hid_element *element[MAX_DEVICES][MAX_ELEMENTS];
/* number of active elements per device */
! extern unsigned short element_count[MAX_DEVICES];
/*------------------------------------------------------------------------------
Index: hidio.c
===================================================================
RCS file: /cvsroot/pure-data/externals/io/hidio/hidio.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** hidio.c 30 Nov 2006 06:14:59 -0000 1.2
--- hidio.c 1 Dec 2006 15:07:46 -0000 1.3
***************
*** 41,46 ****
--- 41,66 ----
unsigned short global_debug_level = 0;
+ /*------------------------------------------------------------------------------
+ * 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 hidio_instance_count;
+
+ /* this is used to test for the first instance to execute */
+ double last_execute_time[MAX_DEVICES];
+
static t_class *hidio_class;
+ /* 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
***************
*** 89,93 ****
static void output_status(t_hidio *x, t_symbol *selector, t_float output_value)
{
! t_atom *output_atom = getbytes(sizeof(t_atom));
SETFLOAT(output_atom, output_value);
outlet_anything( x->x_status_outlet, selector, 1, output_atom);
--- 109,113 ----
static void output_status(t_hidio *x, t_symbol *selector, t_float output_value)
{
! t_atom *output_atom = (t_atom *)getbytes(sizeof(t_atom));
SETFLOAT(output_atom, output_value);
outlet_anything( x->x_status_outlet, selector, 1, output_atom);
***************
*** 149,158 ****
static short get_device_number_from_arguments(int argc, t_atom *argv)
{
short device_number = -1;
unsigned short device_type_instance;
unsigned int usage;
unsigned short vendor_id;
unsigned short product_id;
- char device_type_string[MAXPDSTRING] = "";
t_symbol *first_argument;
t_symbol *second_argument;
--- 169,184 ----
static short get_device_number_from_arguments(int argc, t_atom *argv)
{
+ #ifdef PD
short device_number = -1;
+ char device_type_string[MAXPDSTRING] = "";
unsigned short device_type_instance;
+ #else
+ long device_number = -1;
+ char *device_type_string;
+ long device_type_instance;
+ #endif
unsigned int usage;
unsigned short vendor_id;
unsigned short product_id;
t_symbol *first_argument;
t_symbol *second_argument;
***************
*** 160,168 ****
--- 186,203 ----
if(argc == 1)
{
+ #ifdef PD
first_argument = atom_getsymbolarg(0,argc,argv);
if(first_argument == &s_)
+ #else
+ atom_arg_getsym(&first_argument, 0,argc,argv);
+ if(first_argument == _sym_nothing)
+ #endif
{ // single float arg means device #
post("first_argument == &s_");
+ #ifdef PD
device_number = (short) atom_getfloatarg(0,argc,argv);
+ #else
+ atom_arg_getlong(&device_number, 0, argc, argv);
+ #endif
if(device_number < 0) device_number = -1;
debug_print(LOG_DEBUG,"[hidio] setting device# to %d",device_number);
***************
*** 170,174 ****
--- 205,214 ----
else
{ // single symbol arg means first instance of a device type
+ #ifdef PD
atom_string(argv, device_type_string, MAXPDSTRING-1);
+ #else
+ device_type_string = atom_string(argv);
+ // LATER do we have to free this string manually???
+ #endif
usage = name_to_usage(device_type_string);
device_number = get_device_number_from_usage(0, usage >> 16,
***************
*** 180,190 ****
--- 220,242 ----
else if(argc == 2)
{
+ #ifdef PD
first_argument = atom_getsymbolarg(0,argc,argv);
second_argument = atom_getsymbolarg(1,argc,argv);
if( second_argument == &s_ )
+ #else
+ atom_arg_getsym(&first_argument, 0,argc,argv);
+ atom_arg_getsym(&second_argument, 1,argc,argv);
+ if( second_argument == _sym_nothing )
+ #endif
{ /* a symbol then a float means match on usage */
+ #ifdef PD
atom_string(argv, device_type_string, MAXPDSTRING-1);
usage = name_to_usage(device_type_string);
device_type_instance = atom_getfloatarg(1,argc,argv);
+ #else
+ device_type_string = atom_string(argv);
+ usage = name_to_usage(device_type_string);
+ atom_arg_getlong(&device_type_instance, 1, argc, argv);
+ #endif
debug_print(LOG_DEBUG,"[hidio] looking for %s at #%d",
device_type_string, device_type_instance);
***************
*** 341,345 ****
--- 393,401 ----
// debug_print(LOG_DEBUG,"hidio_read");
unsigned int i;
+ #ifdef PD
double right_now = clock_getlogicaltime();
+ #else
+ double right_now = (double)systime_ms();
+ #endif
t_hid_element *current_element;
***************
*** 387,390 ****
--- 443,455 ----
}
+ #ifndef PD
+ static void hidio_int(t_hidio* x, long l)
+ {
+ debug_print(LOG_DEBUG,"hid_int");
+
+ hidio_set_from_float(x, (float)l);
+ }
+ #endif
+
static void hidio_debug(t_hidio *x, t_float f)
{
***************
*** 410,413 ****
--- 475,479 ----
static void *hidio_new(t_symbol *s, int argc, t_atom *argv)
{
+ #ifdef PD
t_hidio *x = (t_hidio *)pd_new(hidio_class);
unsigned int i;
***************
*** 432,435 ****
--- 498,519 ----
x->x_data_outlet = outlet_new(&x->x_obj, 0);
x->x_status_outlet = outlet_new(&x->x_obj, 0);
+ #else /* Max */
+ t_hidio *x = (t_hidio *)object_alloc(hidio_class);
+ unsigned int i;
+
+ /* init vars */
+ global_debug_level = 9; /* high numbers here means see more messages */
+ x->x_has_ff = 0;
+ x->x_device_open = 0;
+ x->x_started = 0;
+ x->x_delay = DEFAULT_DELAY;
+ for(i=0; i<MAX_DEVICES; ++i) last_execute_time[i] = 0;
+
+ x->x_clock = clock_new(x, (method)hidio_read);
+
+ /* create anything outlet used for HID data */
+ x->x_status_outlet = outlet_new(x, "anything");
+ x->x_data_outlet = outlet_new(x, "anything");
+ #endif
x->x_device_number = get_device_number_from_arguments(argc, argv);
***************
*** 441,444 ****
--- 525,529 ----
}
+ #ifdef PD
void hidio_setup(void)
{
***************
*** 481,483 ****
--- 566,654 ----
post("\tcompiled on "__DATE__" at "__TIME__ " ");
}
+ #else /* Max */
+ static void hidio_notify(t_hidio *x, t_symbol *s, t_symbol *msg, void *sender, void *data)
+ {
+ if (msg == _sym_free) // this message is sent when a child object is freeing
+ {
+ object_detach(gensym("_obex_hidio"), s, x);
+ object_unregister(sender);
+ }
+ }
+
+ static void hidio_assist(t_hidio *x, void *b, long m, long a, char *s)
+ {
+ if (m == 2)
+ {
+ sprintf(s, "hidio outlet");
+ }
+ else
+ {
+ switch (a)
+ {
+ case 0:
+ sprintf(s, "inlet 1");
+ break;
+ case 1:
+ sprintf(s, "inlet 2");
+ break;
+ }
+ }
+ }
+
+ int main()
+ {
+ t_class *c;
+
+ c = class_new("hidio", (method)hidio_new, (method)hidio_free, (short)sizeof(t_hidio),
+ 0L, A_GIMME, 0);
+
+ /* initialize the common symbols, since we want to use them */
+ common_symbols_init();
+
+ /* register the byte offset of obex with the class */
+ class_obexoffset_set(c, calcoffset(t_hidio, x_obex));
+
+ /* add methods to the class */
+ class_addmethod(c, (method)hidio_int, "int", A_LONG, 0);
+ class_addmethod(c, (method)hidio_float, "float", A_FLOAT, 0);
+ class_addmethod(c, (method)hidio_read, "bang", A_GIMME, 0);
+
+ /* add inlet message methods */
+ class_addmethod(c, (method)hidio_debug, "debug",A_DEFFLOAT,0);
+ class_addmethod(c, (method)hidio_build_device_list, "refresh",0);
+ class_addmethod(c, (method)hidio_print, "print",0);
+ class_addmethod(c, (method)hidio_info, "info",0);
+ class_addmethod(c, (method)hidio_open, "open",A_GIMME,0);
+ class_addmethod(c, (method)hidio_close, "close",0);
+ class_addmethod(c, (method)hidio_poll, "poll",A_DEFFLOAT,0);
+ /* force feedback messages */
+ class_addmethod(c, (method)hidio_ff_autocenter, "ff_autocenter",A_DEFFLOAT,0);
+ class_addmethod(c, (method)hidio_ff_gain, "ff_gain",A_DEFFLOAT,0);
+ class_addmethod(c, (method)hidio_ff_motors, "ff_motors",A_DEFFLOAT,0);
+ class_addmethod(c, (method)hidio_ff_continue, "ff_continue",0);
+ class_addmethod(c, (method)hidio_ff_pause, "ff_pause",0);
+ class_addmethod(c, (method)hidio_ff_reset, "ff_reset",0);
+ class_addmethod(c, (method)hidio_ff_stopall, "ff_stopall",0);
+ /* ff tests */
+ class_addmethod(c, (method)hidio_ff_fftest, "fftest",A_DEFFLOAT,0);
+ class_addmethod(c, (method)hidio_ff_print, "ff_print",0);
+
+ class_addmethod(c, (method)hidio_assist, "assist", A_CANT, 0);
+
+ /* add a notify method, so we get notifications from child objects */
+ class_addmethod(c, (method)hidio_notify, "notify", A_CANT, 0);
+ // add methods for dumpout and quickref
+ class_addmethod(c, (method)object_obex_dumpout, "dumpout", A_CANT, 0);
+ class_addmethod(c, (method)object_obex_quickref, "quickref", A_CANT, 0);
+
+ /* we want this class to instantiate inside of the Max UI; ergo CLASS_BOX */
+ class_register(CLASS_BOX, c);
+ hidio_class = c;
+
+ finder_addclass("Devices", "hidio");
+ post("hidio: © 2006 by Olaf Matthes");
+
+ return 0;
+ }
+ #endif