Update of /cvsroot/pure-data/externals/hcs In directory sc8-pr-cvs1:/tmp/cvs-serv6766
Modified Files: Makefile linuxevent.c linuxevent-help.pd linuxevent-joystick.pd linuxhid.h linuxjoystick.c linuxjoystick-help.pd linuxmouse.c linuxmouse-help.pd Added Files: linuxhid.pd Log Message: cleaned up code substantially; got everything working; made help patches
--- NEW FILE: linuxhid.pd --- #N canvas 618 332 428 305 10; #X obj 13 10 cnv 15 400 40 empty empty Linux_HID 20 12 1 18 -261689 -66577 0; #X text 28 96 Raw access to the mouse output , not tied to the sccreen borders.; #X text 22 169 Raw access to the joystick output with a fixed number of outlets.; #X text 22 239 Raw access to the output of the Linux Event system. ; #X obj 16 75 linuxmouse; #X obj 18 219 linuxevent; #X obj 16 146 linuxjoystick;
Index: Makefile =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/Makefile,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** Makefile 19 Jul 2003 02:40:18 -0000 1.9 --- Makefile 17 Nov 2003 21:09:44 -0000 1.10 *************** *** 1,5 **** CC=gcc-3.2
! pd_linux: pan_gogins~.pd_linux range.pd_linux linuxmouse.pd_linux linuxevent.pd_linux linuxjoystick.pd_linux ifeel.pd_linux
clean: ; rm -f *.pd_linux *.o *~ --- 1,5 ---- CC=gcc-3.2
! pd_linux: pan_gogins~.pd_linux range.pd_linux linuxmouse.pd_linux linuxevent.pd_linux linuxjoystick.pd_linux ifeel.pd_linux platformdummy.pd_linux
clean: ; rm -f *.pd_linux *.o *~ *************** *** 13,17 **** -Wno-unused -Wno-parentheses -Wno-switch
! LINUXINCLUDE = -I/usr/local/lib/pd/include -I../../pd/src
.c.pd_linux: --- 13,17 ---- -Wno-unused -Wno-parentheses -Wno-switch
! LINUXINCLUDE = -I/usr/local/lib/pd/include -I../../pd/src -I/usr/local/include
.c.pd_linux:
Index: linuxevent.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxevent.c,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** linuxevent.c 17 Nov 2003 06:18:23 -0000 1.3 --- linuxevent.c 17 Nov 2003 21:09:45 -0000 1.4 *************** *** 2,6 ****
#define LINUXEVENT_DEVICE "/dev/input/event0" - #define LINUXEVENT_OUTLETS 4
static char *version = "$Revision$"; --- 2,5 ---- *************** *** 14,21 **** t_object x_obj; t_int x_fd; ! t_symbol* x_devname; t_clock *x_clock; int read_ok; int started; struct input_event x_input_event; t_outlet *x_input_event_time_outlet; --- 13,21 ---- t_object x_obj; t_int x_fd; ! t_symbol *x_devname; t_clock *x_clock; int read_ok; int started; + int x_delaytime; struct input_event x_input_event; t_outlet *x_input_event_time_outlet; *************** *** 23,27 **** t_outlet *x_input_event_code_outlet; t_outlet *x_input_event_value_outlet; - int x_delaytime; }t_linuxevent;
--- 23,26 ---- *************** *** 30,49 **** */
! //DONE ! static int linuxevent_close(t_linuxevent *x) ! { ! DEBUG(post("linuxevent_close");) ! ! if (x->x_fd <0) { ! return 0; ! } else { ! close (x->x_fd); ! return 1; } }
! //DONE ! static int linuxevent_open(t_linuxevent *x,t_symbol* s) ! { int eventType, eventCode, buttons, rel_axes, abs_axes, ff; unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; --- 29,56 ---- */
! void linuxevent_stop(t_linuxevent* x) { ! DEBUG(post("linuxevent_stop");); ! ! if (x->x_fd >= 0 && x->started) { ! clock_unset(x->x_clock); ! post("linuxevent: polling stopped"); ! x->started = 0; } }
! static int linuxevent_close(t_linuxevent *x) { ! DEBUG(post("linuxevent_close");); ! ! /* just to be safe, stop it first */ ! linuxevent_stop(x); ! ! if (x->x_fd <0) return 0; ! close (x->x_fd); ! post ("[linuxevent] closed %s",x->x_devname->s_name); ! ! return 1; ! } ! ! static int linuxevent_open(t_linuxevent *x, t_symbol *s) { int eventType, eventCode, buttons, rel_axes, abs_axes, ff; unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; *************** *** 58,85 **** if (s != &s_) x->x_devname = s; - else { - post("You need to set a input device (i.e /dev/input/event0)"); - }
/* open device */ if (x->x_devname) { ! post("opening ..."); ! /* open the linuxevent device read-only, non-exclusive */ ! x->x_fd = open (x->x_devname->s_name, O_RDONLY | O_NONBLOCK); ! if (x->x_fd >= 0 ) post("done"); ! else post("failed"); ! } ! else { ! return 1; ! } ! ! /* test if device open */ ! if (x->x_fd >= 0) ! post("%s opened",x->x_devname->s_name); ! else { ! post("unable to open %s",x->x_devname->s_name); ! x->x_fd = -1; ! return 0; ! }
/* read input_events from the LINUXEVENT_DEVICE stream --- 65,80 ---- if (s != &s_) x->x_devname = s;
/* open device */ if (x->x_devname) { ! /* open the device read-only, non-exclusive */ ! x->x_fd = open (x->x_devname->s_name, O_RDONLY | O_NONBLOCK); ! /* test if device open */ ! if (x->x_fd < 0 ) { ! post("[linuxevent] open %s failed",x->x_devname->s_name); ! x->x_fd = -1; ! return 0; ! } ! } else return 1;
/* read input_events from the LINUXEVENT_DEVICE stream *************** *** 90,99 **** /* get name of device */ ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); ! post ("configuring %s",devicename);
/* get bitmask representing supported events (axes, buttons, etc.) */ memset(bitmask, 0, sizeof(bitmask)); ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); ! post("Supported events:");
rel_axes = 0; --- 85,94 ---- /* get name of device */ ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); ! post ("Configuring %s on %s",devicename,x->x_devname->s_name);
/* get bitmask representing supported events (axes, buttons, etc.) */ memset(bitmask, 0, sizeof(bitmask)); ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); ! post("\nSupported events:");
rel_axes = 0; *************** *** 148,187 **** post ("\nUsing %d relative axes, %d absolute axes, and %d buttons.", rel_axes, abs_axes, buttons); if (ff > 0) post ("Detected %d force feedback types",ff); ! post (""); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); post ("This object is under development! The interface could change at anytime!"); post ("As I write cross-platform versions, the interface might have to change."); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); ! return 1; }
! ! static int linuxevent_read(t_linuxevent *x,int fd) ! { ! // int readBytes; ! ! if (x->x_fd < 0) return 0; ! ! while (read (x->x_fd, &(x->x_input_event), sizeof(struct input_event)) > -1) { ! outlet_float (x->x_input_event_value_outlet, (int)x->x_input_event.value); ! outlet_float (x->x_input_event_code_outlet, x->x_input_event.code); ! outlet_float (x->x_input_event_type_outlet, x->x_input_event.type); ! /* input_event.time is a timeval struct from <sys/time.h> */ ! /* outlet_float (x->x_input_event_time_outlet, x->x_input_event.time); */ ! }
! if (x->started) { ! clock_delay(x->x_clock, x->x_delaytime); ! }
! return 1; }
/* Actions */ ! ! static void linuxevent_float(t_linuxevent* x) ! { DEBUG(post("linuxevent_float");)
--- 143,174 ---- post ("\nUsing %d relative axes, %d absolute axes, and %d buttons.", rel_axes, abs_axes, buttons); if (ff > 0) post ("Detected %d force feedback types",ff); ! post ("\nWARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); post ("This object is under development! The interface could change at anytime!"); post ("As I write cross-platform versions, the interface might have to change."); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING\n"); ! return 1; }
+ static int linuxevent_read(t_linuxevent *x,int fd) { + if (x->x_fd < 0) return 0;
! while (read (x->x_fd, &(x->x_input_event), sizeof(struct input_event)) > -1) { ! outlet_float (x->x_input_event_value_outlet, (int)x->x_input_event.value); ! outlet_float (x->x_input_event_code_outlet, x->x_input_event.code); ! outlet_float (x->x_input_event_type_outlet, x->x_input_event.type); ! /* input_event.time is a timeval struct from <sys/time.h> */ ! /* outlet_float (x->x_input_event_time_outlet, x->x_input_event.time); */ ! }
! if (x->started) { ! clock_delay(x->x_clock, x->x_delaytime); ! }
! return 1; }
/* Actions */ ! static void linuxevent_float(t_linuxevent* x) { DEBUG(post("linuxevent_float");)
*************** *** 199,235 **** }
! // DONE ! void linuxevent_start(t_linuxevent* x) ! { ! DEBUG(post("linuxevent_start");); ! post("clock delay: %d",x->x_delaytime);
! if (x->x_fd >= 0 && !x->started) { ! clock_delay(x->x_clock, 2); ! post("linuxevent: start"); ! x->started = 1; ! } ! } ! ! ! // DONE ! void linuxevent_stop(t_linuxevent* x) ! { ! DEBUG(post("linuxevent_stop");); ! ! post("clock delay: %d",x->x_delaytime); ! ! if (x->x_fd >= 0 && x->started) { ! clock_unset(x->x_clock); ! post("linuxevent: stop"); ! x->started = 0; ! } }
! /* Misc setup functions */ ! ! ! static void linuxevent_free(t_linuxevent* x) ! { DEBUG(post("linuxevent_free");)
--- 186,203 ---- }
! void linuxevent_start(t_linuxevent* x) { ! DEBUG(post("linuxevent_start"););
! if (x->x_fd >= 0 && !x->started) { ! clock_delay(x->x_clock, 5); ! post("linuxevent: polling started"); ! x->started = 1; ! } else { ! post("You need to set a input device (i.e /dev/input/event0)"); ! } }
! /* setup functions */ ! static void linuxevent_free(t_linuxevent* x) { DEBUG(post("linuxevent_free");)
*************** *** 241,246 **** }
! static void *linuxevent_new(t_symbol *s) ! { int i; t_linuxevent *x = (t_linuxevent *)pd_new(linuxevent_class); --- 209,213 ---- }
! static void *linuxevent_new(t_symbol *s) { int i; t_linuxevent *x = (t_linuxevent *)pd_new(linuxevent_class); *************** *** 264,269 **** x->x_input_event_value_outlet = outlet_new(&x->x_obj, &s_float);
if (s != &s_) ! x->x_devname = s;
/* Open the device and save settings */ --- 231,237 ---- x->x_input_event_value_outlet = outlet_new(&x->x_obj, &s_float);
+ /* set to the value from the object argument, if that exists */ if (s != &s_) ! x->x_devname = s;
/* Open the device and save settings */ *************** *** 274,280 **** }
! ! void linuxevent_setup(void) ! { DEBUG(post("linuxevent_setup");) linuxevent_class = class_new(gensym("linuxevent"), --- 242,246 ---- }
! void linuxevent_setup(void) { DEBUG(post("linuxevent_setup");) linuxevent_class = class_new(gensym("linuxevent"), *************** *** 288,297 ****
/* add inlet message methods */ ! class_addmethod(linuxevent_class, (t_method) linuxevent_open,gensym("open"),A_DEFSYM); class_addmethod(linuxevent_class,(t_method) linuxevent_close,gensym("close"),0); class_addmethod(linuxevent_class,(t_method) linuxevent_start,gensym("start"),0); class_addmethod(linuxevent_class,(t_method) linuxevent_stop,gensym("stop"),0); ! class_addmethod(linuxevent_class,(t_method) linuxevent_delay,gensym("delay"),A_FLOAT,0); ! }
--- 254,264 ----
/* add inlet message methods */ ! class_addmethod(linuxevent_class,(t_method) linuxevent_delay,gensym("delay"),A_DEFFLOAT,0); ! class_addmethod(linuxevent_class,(t_method) linuxevent_open,gensym("open"),A_DEFSYM,0); class_addmethod(linuxevent_class,(t_method) linuxevent_close,gensym("close"),0); class_addmethod(linuxevent_class,(t_method) linuxevent_start,gensym("start"),0); + class_addmethod(linuxevent_class,(t_method) linuxevent_start,gensym("poll"),0); class_addmethod(linuxevent_class,(t_method) linuxevent_stop,gensym("stop"),0); ! class_addmethod(linuxevent_class,(t_method) linuxevent_stop,gensym("nopoll"),0); }
Index: linuxevent-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxevent-help.pd,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** linuxevent-help.pd 17 Nov 2003 06:18:23 -0000 1.2 --- linuxevent-help.pd 17 Nov 2003 21:09:45 -0000 1.3 *************** *** 1,23 **** ! #N canvas 547 51 569 453 10; #X floatatom 241 326 5 0 0 3 code - -; #X floatatom 305 326 5 0 0 3 value - -; #X floatatom 177 326 4 0 0 3 type - -; #X floatatom 104 326 9 0 0 3 time - -; ! #X msg 164 199 start; ! #X msg 165 221 stop; #X obj 114 303 linuxevent /dev/input/event0; ! #X obj 114 158 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X text 134 158 bang to get an update; ! #X text 212 211 start/stop polling; ! #X obj 25 158 metro 20; ! #X text 236 260 time between polls (ms); ! #X obj 25 136 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X msg 45 136 stop; ! #X msg 169 260 delay 20; ! #X obj 114 109 key; ! #X obj 114 129 select 98; ! #X text 187 129 <- type 'b' for a bang; #N canvas 278 328 611 524 Event_Codes 0; #X text 28 48 (For a complete listing of Linux Input Events , see --- 1,19 ---- ! #N canvas 287 167 569 543 10; #X floatatom 241 326 5 0 0 3 code - -; #X floatatom 305 326 5 0 0 3 value - -; #X floatatom 177 326 4 0 0 3 type - -; #X floatatom 104 326 9 0 0 3 time - -; ! #X msg 172 202 start; ! #X msg 173 224 stop; #X obj 114 303 linuxevent /dev/input/event0; ! #X obj 114 184 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 25 184 metro 20; ! #X text 293 260 time between polls (ms); ! #X obj 25 162 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X msg 45 162 stop; ! #X msg 226 260 delay 20; ! #X obj 114 135 key; #N canvas 278 328 611 524 Event_Codes 0; #X text 28 48 (For a complete listing of Linux Input Events , see *************** *** 181,186 **** system. It is used for access the output of various Human Interface Devices , like mice , joysticks , tablets , etc.; ! #X text 62 424 Here's an example for using a joystick:; ! #X obj 366 423 linuxevent-joystick; #X connect 4 0 6 0; #X connect 5 0 6 0; --- 177,200 ---- system. It is used for access the output of various Human Interface Devices , like mice , joysticks , tablets , etc.; ! #X text 346 18 related HID objects:; ! #X obj 497 17 linuxhid; ! #X text 33 111 bang to get an update when polling is stopped.; ! #X msg 236 201 poll; ! #X msg 236 223 nopoll; ! #X text 153 183 start/stop polling (synonyms for the same thing); ! #X obj 114 155 sel 98; ! #X text 160 155 <- (type 'b' for a bang); ! #X text 15 413 Here's an example for using a joystick:; ! #X msg 72 441 start; ! #X msg 116 441 stop; ! #X obj 82 469 linuxevent-joystick /dev/input/event1; ! #X floatatom 336 498 2 0 0 3 button# - -; ! #X floatatom 393 497 2 0 0 3 button_value - -; ! #X floatatom 82 498 5 0 0 3 y-axis - -; ! #X floatatom 35 498 5 0 0 3 x-axis - -; ! #X floatatom 181 499 3 0 0 3 hat-X - -; ! #X floatatom 227 499 3 0 0 3 hat-Y - -; ! #X floatatom 131 499 5 0 0 3 twist - -; ! #X floatatom 270 498 5 0 0 3 throttle - -; #X connect 4 0 6 0; #X connect 5 0 6 0; *************** *** 190,197 **** #X connect 6 3 1 0; #X connect 7 0 6 0; ! #X connect 10 0 6 0; ! #X connect 12 0 10 0; ! #X connect 13 0 10 0; ! #X connect 14 0 6 0; ! #X connect 15 0 16 0; ! #X connect 16 0 7 0; --- 204,223 ---- #X connect 6 3 1 0; #X connect 7 0 6 0; ! #X connect 8 0 6 0; ! #X connect 10 0 8 0; ! #X connect 11 0 8 0; ! #X connect 12 0 6 0; ! #X connect 13 0 26 0; ! #X connect 23 0 6 0; ! #X connect 24 0 6 0; ! #X connect 26 0 7 0; ! #X connect 29 0 31 0; ! #X connect 30 0 31 0; ! #X connect 31 0 35 0; ! #X connect 31 1 34 0; ! #X connect 31 2 38 0; ! #X connect 31 3 36 0; ! #X connect 31 4 37 0; ! #X connect 31 5 39 0; ! #X connect 31 6 32 0; ! #X connect 31 7 33 0;
Index: linuxevent-joystick.pd =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxevent-joystick.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** linuxevent-joystick.pd 17 Nov 2003 06:18:23 -0000 1.1 --- linuxevent-joystick.pd 17 Nov 2003 21:09:45 -0000 1.2 *************** *** 1,29 **** ! #N canvas 270 365 499 362 10; ! #X obj 16 86 linuxevent /dev/input/event1; #X msg 35 43 start; #X msg 44 62 stop; #X obj 16 9 inlet; #X obj 79 116 pack f f f; - #X obj 79 139 route 1 3; #X obj 137 159 print UNKNOWN_JOYSTICK_EVENT_TYPE; #X text 148 139 types (1=buttons 3=abs axes); ! #X obj 108 187 route 0 1 6 7; ! #X obj 194 209 print UNKNOWN_JOYSTICK_EVENT_CODE; ! #X obj 151 249 print THROTTLE; ! #X text 204 190 codes (0=X 1=Y 6=throttle 7=rudder); ! #X obj 172 229 print RUDDER; ! #X obj 129 269 print Y-AXIS; ! #X obj 108 290 print X-AXIS; ! #X connect 0 1 4 0; ! #X connect 0 2 4 1; ! #X connect 0 3 4 2; ! #X connect 1 0 0 0; ! #X connect 2 0 0 0; ! #X connect 3 0 0 0; ! #X connect 4 0 5 0; ! #X connect 5 1 8 0; ! #X connect 5 2 6 0; ! #X connect 8 0 14 0; ! #X connect 8 1 13 0; ! #X connect 8 2 10 0; ! #X connect 8 3 12 0; --- 1,76 ---- ! #N canvas 455 201 722 483 10; #X msg 35 43 start; #X msg 44 62 stop; #X obj 16 9 inlet; #X obj 79 116 pack f f f; #X obj 137 159 print UNKNOWN_JOYSTICK_EVENT_TYPE; #X text 148 139 types (1=buttons 3=abs axes); ! #X obj 167 256 print UNKNOWN_JOYSTICK_EVENT_CODE; ! #X obj 275 409 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 306 409 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 337 409 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 369 408 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 400 408 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 431 409 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 557 410 bng 30 250 50 0 empty empty not_routed 33 6 1 8 -262144 ! -1 -1; ! #X obj 275 386 route 288 289 290 291 292 293 294 295 296; ! #X obj 464 409 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 493 408 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 525 408 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 79 139 route 3 1; ! #X obj 38 378 outlet; ! #X obj 59 357 outlet; ! #X obj 80 337 outlet; ! #X obj 102 317 outlet; ! #X obj 123 297 outlet; ! #X obj 144 277 outlet; ! #X text 52 214 codes (0=X 1=Y 6=throttle 7=rudder , 16=hat0X , 17=hat0Y) ! ; ! #X obj 456 338 outlet; ! #X text 446 354 button_num; ! #X text 537 355 button_value; ! #X obj 556 339 outlet; ! #X obj 456 272 unpack f f; ! #X obj 456 308 - 288; ! #X obj 16 86 linuxevent $1; ! #X obj 38 234 route 0 1 7 16 17 6; ! #X connect 0 0 32 0; ! #X connect 1 0 32 0; ! #X connect 2 0 32 0; ! #X connect 3 0 18 0; ! #X connect 14 0 7 0; ! #X connect 14 1 8 0; ! #X connect 14 2 9 0; ! #X connect 14 3 10 0; ! #X connect 14 4 11 0; ! #X connect 14 5 12 0; ! #X connect 14 6 15 0; ! #X connect 14 7 16 0; ! #X connect 14 8 17 0; ! #X connect 14 9 13 0; ! #X connect 18 0 33 0; ! #X connect 18 1 14 0; ! #X connect 18 1 30 0; ! #X connect 18 2 4 0; ! #X connect 30 0 31 0; ! #X connect 30 1 29 0; ! #X connect 31 0 26 0; ! #X connect 32 1 3 0; ! #X connect 32 2 3 1; ! #X connect 32 3 3 2; ! #X connect 33 0 19 0; ! #X connect 33 1 20 0; ! #X connect 33 2 21 0; ! #X connect 33 3 22 0; ! #X connect 33 4 23 0; ! #X connect 33 5 24 0;
Index: linuxhid.h =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxhid.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** linuxhid.h 23 Jun 2003 13:11:43 -0000 1.4 --- linuxhid.h 17 Nov 2003 21:09:45 -0000 1.5 *************** *** 1,3 **** ! #include "m_pd.h"
#ifdef PD_MAJOR_VERSION --- 1,3 ---- ! #include <m_pd.h>
#ifdef PD_MAJOR_VERSION *************** *** 19,24 ****
! #define DEBUG(x) ! /*#define DEBUG(x) x */
/*------------------------------------------------------------------------------ --- 19,24 ----
! //#define DEBUG(x) ! #define DEBUG(x) x
/*------------------------------------------------------------------------------
Index: linuxjoystick.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxjoystick.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** linuxjoystick.c 25 Apr 2003 23:42:19 -0000 1.2 --- linuxjoystick.c 17 Nov 2003 21:09:45 -0000 1.3 *************** *** 1,5 **** #include "linuxhid.h"
- #define LINUXJOYSTICK_DEVICE "/dev/input/event0" #define LINUXJOYSTICK_AXES 6
--- 1,4 ---- *************** *** 12,27 ****
typedef struct _linuxjoystick { ! t_object x_obj; ! t_int x_fd; ! t_symbol* x_devname; ! int read_ok; ! int started; ! struct input_event x_input_event; ! t_outlet *x_axis_out[LINUXJOYSTICK_AXES]; ! t_outlet *x_button_num_out; ! t_outlet *x_button_val_out; ! t_clock *x_clock; ! unsigned char x_buttons; ! unsigned char x_axes; } t_linuxjoystick;
--- 11,27 ----
typedef struct _linuxjoystick { ! t_object x_obj; ! t_int x_fd; ! t_symbol *x_devname; ! t_clock *x_clock; ! int read_ok; ! int started; ! int x_delaytime; ! struct input_event x_input_event; ! t_outlet *x_axis_out[LINUXJOYSTICK_AXES]; ! t_outlet *x_button_num_out; ! t_outlet *x_button_val_out; ! unsigned char x_buttons; ! unsigned char x_axes; } t_linuxjoystick;
*************** *** 30,49 **** */
! //DONE ! static int linuxjoystick_close(t_linuxjoystick *x) ! { ! DEBUG(post("linuxjoystick_close");)
! if (x->x_fd <0) return 0;
! close (x->x_fd);
! return 1; }
! //DONE ! static int linuxjoystick_open(t_linuxjoystick *x,t_symbol* s) ! { ! int eventType, eventCode; unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; char devicename[256] = "Unknown"; --- 30,58 ---- */
! void linuxjoystick_stop(t_linuxjoystick* x) { ! DEBUG(post("linuxjoystick_stop");); ! ! if (x->x_fd >= 0 && x->started) { ! clock_unset(x->x_clock); ! post("linuxjoystick: polling stopped"); ! x->started = 0; ! } ! }
! static int linuxjoystick_close(t_linuxjoystick *x) { ! DEBUG(post("linuxjoystick_close"););
! /* just to be safe, stop it first */ ! linuxjoystick_stop(x);
! if (x->x_fd <0) return 0; ! close (x->x_fd); ! post ("[linuxjoystick] closed %s",x->x_devname->s_name); ! ! return 1; }
! static int linuxjoystick_open(t_linuxjoystick *x, t_symbol *s) { ! int eventType, eventCode, buttons, rel_axes, abs_axes, ff; unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; char devicename[256] = "Unknown"; *************** *** 57,84 **** if (s != &s_) x->x_devname = s; - else { - post("You need to set a input device (i.e /dev/input/event0)"); - }
/* open device */ if (x->x_devname) { ! post("opening ..."); ! /* open the linuxjoystick device read-only, non-exclusive */ ! x->x_fd = open (x->x_devname->s_name, O_RDONLY | O_NONBLOCK); ! if (x->x_fd >= 0 ) post("done"); ! else post("failed"); ! } ! else { ! return 1; ! } ! ! /* test if device open */ ! if (x->x_fd >= 0) ! post("%s opened",x->x_devname->s_name); ! else { ! post("unable to open %s",x->x_devname->s_name); ! x->x_fd = -1; ! return 0; ! }
/* read input_events from the LINUXJOYSTICK_DEVICE stream --- 66,81 ---- if (s != &s_) x->x_devname = s;
/* open device */ if (x->x_devname) { ! /* open the device read-only, non-exclusive */ ! x->x_fd = open (x->x_devname->s_name, O_RDONLY | O_NONBLOCK); ! /* test if device open */ ! if (x->x_fd < 0 ) { ! post("[linuxjoystick] open %s failed",x->x_devname->s_name); ! x->x_fd = -1; ! return 0; ! } ! } else return 1;
/* read input_events from the LINUXJOYSTICK_DEVICE stream *************** *** 89,101 **** /* get name of device */ ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); ! post ("configuring %s",devicename);
/* get bitmask representing supported events (axes, buttons, etc.) */ memset(bitmask, 0, sizeof(bitmask)); ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); ! post("Supported events:");
! x->x_axes = 0; ! x->x_buttons = 0;
/* cycle through all possible event types */ --- 86,100 ---- /* get name of device */ ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); ! post ("Configuring %s on %s",devicename,x->x_devname->s_name);
/* get bitmask representing supported events (axes, buttons, etc.) */ memset(bitmask, 0, sizeof(bitmask)); ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); ! post("\nSupported events:");
! rel_axes = 0; ! abs_axes = 0; ! buttons = 0; ! ff = 0;
/* cycle through all possible event types */ *************** *** 115,324 **** post(" Event code %d (%s)", eventCode, names[eventType] ? (names[eventType][eventCode] ? names[eventType][eventCode] : "?") : "?");
! if ( eventType == EV_KEY ) ! x->x_buttons++; ! else if ( eventType == EV_ABS ) ! x->x_axes++; } } }
! post ("\nUsing %d axes and %d buttons.", x->x_axes, x->x_buttons); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); post ("This object is under development! The interface could change at anytime!"); post ("As I write cross-platform versions, the interface might have to change."); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); ! return 1; }
! ! ! static int linuxjoystick_read(t_linuxjoystick *x,int fd) ! { ! int readBytes; ! int axis_num = 0; ! t_float button_num = 0;
! if (x->x_fd < 0) return 0; ! if (x->read_ok) { ! readBytes = read(x->x_fd, &(x->x_input_event), sizeof(struct input_event)); ! DEBUG(post("reading %d",readBytes);) ! if ( readBytes < 0 ) { ! post("linuxjoystick: read failed"); ! x->read_ok = 0; ! return 0; ! } ! } ! if ( x->x_input_event.type == EV_KEY ) { ! /* key/button event type */ ! switch ( x->x_input_event.code ) { ! case BTN_0: ! button_num = 0; ! break; ! case BTN_1: ! button_num = 1; ! break; ! case BTN_2: ! button_num = 2; ! break; ! case BTN_3: ! button_num = 3; ! break; ! case BTN_4: ! button_num = 4; ! break; ! case BTN_5: ! button_num = 5; ! break; ! case BTN_6: ! button_num = 6; ! break; ! case BTN_7: ! button_num = 7; ! break; ! case BTN_8: ! button_num = 8; ! break; ! case BTN_9: ! button_num = 9; ! break; ! case BTN_TRIGGER: ! button_num = 10; ! break; ! case BTN_THUMB: ! button_num = 11; ! break; ! case BTN_THUMB2: ! button_num = 12; ! break; ! case BTN_TOP: ! button_num = 13; ! break; ! case BTN_TOP2: ! button_num = 14; ! break; ! case BTN_PINKIE: ! button_num = 15; ! break; ! case BTN_BASE: ! button_num = 16; ! break; ! case BTN_BASE2: ! button_num = 17; ! break; ! case BTN_BASE3: ! button_num = 18; ! break; ! case BTN_BASE4: ! button_num = 19; ! break; ! case BTN_BASE5: ! button_num = 20; ! break; ! case BTN_BASE6: ! button_num = 21; ! break; ! } ! outlet_float (x->x_button_val_out, x->x_input_event.value); ! outlet_float (x->x_button_num_out, button_num); ! } ! else if ( x->x_input_event.type == EV_ABS ) { ! /* Relative Axes Event Type */ ! switch ( x->x_input_event.code ) { ! case ABS_X: ! axis_num = 0; ! break; ! case ABS_Y: ! axis_num = 1; ! break; ! case ABS_Z: ! axis_num = 2; ! break; ! case ABS_HAT0X: ! axis_num = 3; ! break; ! case ABS_HAT0Y: ! axis_num = 4; ! break; ! case ABS_THROTTLE: ! axis_num = 5; ! break; ! } ! outlet_float (x->x_axis_out[axis_num], (int)x->x_input_event.value); ! } ! ! return 1; ! } ! !
! /* Actions */
! static void linuxjoystick_bang(t_linuxjoystick* x) ! { ! DEBUG(post("linuxjoystick_bang");) ! }
! static void linuxjoystick_float(t_linuxjoystick* x) ! { DEBUG(post("linuxjoystick_float");)
}
! // DONE ! void linuxjoystick_start(t_linuxjoystick* x) ! { ! DEBUG(post("linuxjoystick_start");) ! ! if (x->x_fd >= 0 && !x->started) { ! sys_addpollfn(x->x_fd, (t_fdpollfn)linuxjoystick_read, x); ! post("linuxjoystick: start"); ! x->started = 1; ! } }
! ! // DONE ! void linuxjoystick_stop(t_linuxjoystick* x) ! { ! DEBUG(post("linuxjoystick_stop");) ! ! if (x->x_fd >= 0 && x->started) { ! sys_rmpollfn(x->x_fd); ! post("linuxjoystick: stop"); ! x->started = 0; ! } }
! /* Misc setup functions */ ! ! ! static void linuxjoystick_free(t_linuxjoystick* x) ! { DEBUG(post("linuxjoystick_free");)
! if (x->x_fd < 0) return; ! linuxjoystick_stop(x); ! close (x->x_fd); }
! static void *linuxjoystick_new(t_symbol *s) ! { int i; t_linuxjoystick *x = (t_linuxjoystick *)pd_new(linuxjoystick_class);
DEBUG(post("linuxjoystick_new");) ! /* init vars */ x->x_fd = -1; x->read_ok = 1; x->started = 0;
/* create outlets for each axis */ for (i = 0; i < LINUXJOYSTICK_AXES; i++) ! x->x_axis_out[i] = outlet_new(&x->x_obj, &s_float);
/* create outlets for buttons */ --- 114,327 ---- post(" Event code %d (%s)", eventCode, names[eventType] ? (names[eventType][eventCode] ? names[eventType][eventCode] : "?") : "?");
! switch(eventType) { ! case EV_RST: ! break; ! case EV_KEY: ! buttons++; ! break; ! case EV_REL: ! rel_axes++; ! break; ! case EV_ABS: ! abs_axes++; ! break; ! case EV_MSC: ! break; ! case EV_LED: ! break; ! case EV_SND: ! break; ! case EV_REP: ! break; ! case EV_FF: ! ff++; ! break; ! } } } }
! post ("\nUsing %d relative axes, %d absolute axes, and %d buttons.", rel_axes, abs_axes, buttons); ! if (ff > 0) post ("Detected %d force feedback types",ff); ! post ("\nWARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); post ("This object is under development! The interface could change at anytime!"); post ("As I write cross-platform versions, the interface might have to change."); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING\n"); ! return 1; }
! static int linuxjoystick_read(t_linuxjoystick *x,int fd) { ! int readBytes; ! int axis_num = 0; ! t_float button_num = 0;
! if (x->x_fd < 0) return 0;
! while (read (x->x_fd, &(x->x_input_event), sizeof(struct input_event)) > -1) { ! if ( x->x_input_event.type == EV_ABS ) { ! /* Relative Axes Event Type */ ! switch ( x->x_input_event.code ) { ! case ABS_X: ! axis_num = 0; ! break; ! case ABS_Y: ! axis_num = 1; ! break; ! case ABS_Z: ! axis_num = 2; ! break; ! case ABS_HAT0X: ! axis_num = 3; ! break; ! case ABS_HAT0Y: ! axis_num = 4; ! break; ! case ABS_THROTTLE: ! axis_num = 5; ! break; ! } ! outlet_float (x->x_axis_out[axis_num], (int)x->x_input_event.value); ! } ! else if ( x->x_input_event.type == EV_KEY ) { ! /* key/button event type */ ! switch ( x->x_input_event.code ) { ! case BTN_0: ! button_num = 0; ! break; ! case BTN_1: ! button_num = 1; ! break; ! case BTN_2: ! button_num = 2; ! break; ! case BTN_3: ! button_num = 3; ! break; ! case BTN_4: ! button_num = 4; ! break; ! case BTN_5: ! button_num = 5; ! break; ! case BTN_6: ! button_num = 6; ! break; ! case BTN_7: ! button_num = 7; ! break; ! case BTN_8: ! button_num = 8; ! break; ! case BTN_9: ! button_num = 9; ! break; ! case BTN_TRIGGER: ! button_num = 10; ! break; ! case BTN_THUMB: ! button_num = 11; ! break; ! case BTN_THUMB2: ! button_num = 12; ! break; ! case BTN_TOP: ! button_num = 13; ! break; ! case BTN_TOP2: ! button_num = 14; ! break; ! case BTN_PINKIE: ! button_num = 15; ! break; ! case BTN_BASE: ! button_num = 16; ! break; ! case BTN_BASE2: ! button_num = 17; ! break; ! case BTN_BASE3: ! button_num = 18; ! break; ! case BTN_BASE4: ! button_num = 19; ! break; ! case BTN_BASE5: ! button_num = 20; ! break; ! case BTN_BASE6: ! button_num = 21; ! break; ! } ! outlet_float (x->x_button_val_out, x->x_input_event.value); ! outlet_float (x->x_button_num_out, button_num); ! } ! } ! ! if (x->started) { ! clock_delay(x->x_clock, x->x_delaytime); ! }
! return 1; }
! /* Actions */ ! static void linuxjoystick_float(t_linuxjoystick* x) { DEBUG(post("linuxjoystick_float");)
}
! void linuxjoystick_delay(t_linuxjoystick* x, t_float f) { ! DEBUG(post("linuxjoystick_DELAY %f",f);) ! ! /* if the user sets the delay less than zero, reset to default */ ! if ( f > 0 ) { ! x->x_delaytime = (int)f; ! } else { ! x->x_delaytime = 5; ! } }
! void linuxjoystick_start(t_linuxjoystick* x) { ! DEBUG(post("linuxjoystick_start");); ! ! if (x->x_fd >= 0 && !x->started) { ! clock_delay(x->x_clock, 5); ! post("linuxjoystick: polling started"); ! x->started = 1; ! } else { ! post("You need to set a input device (i.e /dev/input/event0)"); ! } }
! /* setup functions */ ! static void linuxjoystick_free(t_linuxjoystick* x) { DEBUG(post("linuxjoystick_free");)
! if (x->x_fd < 0) return; ! linuxjoystick_stop(x); ! clock_free(x->x_clock); close (x->x_fd); }
! static void *linuxjoystick_new(t_symbol *s) { int i; t_linuxjoystick *x = (t_linuxjoystick *)pd_new(linuxjoystick_class);
DEBUG(post("linuxjoystick_new");) ! ! post("[linuxjoystick] %s, written by Hans-Christoph Steiner hans@eds.org",version); ! /* init vars */ x->x_fd = -1; x->read_ok = 1; x->started = 0; + x->x_delaytime = 5; + x->x_clock = clock_new(x, (t_method)linuxjoystick_read);
/* create outlets for each axis */ for (i = 0; i < LINUXJOYSTICK_AXES; i++) ! x->x_axis_out[i] = outlet_new(&x->x_obj, &s_float);
/* create outlets for buttons */ *************** *** 326,331 **** x->x_button_val_out = outlet_new(&x->x_obj, &s_float);
if (s != &s_) ! x->x_devname = s;
/* Open the device and save settings */ --- 329,335 ---- x->x_button_val_out = outlet_new(&x->x_obj, &s_float);
+ /* set to the value from the object argument, if that exists */ if (s != &s_) ! x->x_devname = s;
/* Open the device and save settings */ *************** *** 336,342 **** }
! ! void linuxjoystick_setup(void) ! { DEBUG(post("linuxjoystick_setup");) linuxjoystick_class = class_new(gensym("linuxjoystick"), --- 340,344 ---- }
! void linuxjoystick_setup(void) { DEBUG(post("linuxjoystick_setup");) linuxjoystick_class = class_new(gensym("linuxjoystick"), *************** *** 347,358 **** /* add inlet datatype methods */ class_addfloat(linuxjoystick_class,(t_method) linuxjoystick_float); ! class_addbang(linuxjoystick_class,(t_method) linuxjoystick_bang);
/* add inlet message methods */ ! class_addmethod(linuxjoystick_class, (t_method) linuxjoystick_open,gensym("open"),A_DEFSYM); class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_close,gensym("close"),0); class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_start,gensym("start"),0); class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_stop,gensym("stop"),0); ! }
--- 349,362 ---- /* add inlet datatype methods */ class_addfloat(linuxjoystick_class,(t_method) linuxjoystick_float); ! class_addbang(linuxjoystick_class,(t_method) linuxjoystick_read);
/* add inlet message methods */ ! class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_delay,gensym("delay"),A_DEFFLOAT,0); ! class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_open,gensym("open"),A_DEFSYM,0); class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_close,gensym("close"),0); class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_start,gensym("start"),0); + class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_start,gensym("poll"),0); class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_stop,gensym("stop"),0); ! class_addmethod(linuxjoystick_class,(t_method) linuxjoystick_stop,gensym("nopoll"),0); }
Index: linuxjoystick-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxjoystick-help.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** linuxjoystick-help.pd 17 Nov 2003 03:04:55 -0000 1.1 --- linuxjoystick-help.pd 17 Nov 2003 21:09:45 -0000 1.2 *************** *** 1,98 **** ! #N canvas 61 386 886 505 10; ! #X msg 192 64 start; ! #X msg 203 95 stop; ! #X floatatom 397 180 2 0 0 3 button# - -; ! #X floatatom 454 179 2 0 0 3 button_value - -; ! #X floatatom 143 180 5 0 0 3 y-axis - -; ! #X floatatom 95 180 5 0 0 3 x-axis - -; ! #X floatatom 242 181 3 0 0 3 hat-X - -; ! #X floatatom 288 181 3 0 0 3 hat-Y - -; ! #X floatatom 192 181 5 0 0 3 twist - -; ! #X floatatom 331 180 5 0 0 3 throttle - -; ! #X obj 192 123 linuxjoystick /dev/input/event1; ! #X obj 299 309 select 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21; ! #X obj 297 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 313 355 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 333 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 351 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 370 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 389 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 409 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 734 354 bng 30 250 50 0 empty empty not_recognized 0 -6 0 8 -261689 -1 -1; ! #X obj 689 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 667 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 647 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 631 354 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 613 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 596 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 579 352 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 561 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 541 349 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 523 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 503 350 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 485 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 466 351 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 447 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 428 353 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 439 220 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X connect 0 0 10 0; ! #X connect 1 0 10 0; ! #X connect 2 0 11 0; ! #X connect 3 0 35 0; ! #X connect 10 0 5 0; ! #X connect 10 1 4 0; ! #X connect 10 2 8 0; ! #X connect 10 3 6 0; ! #X connect 10 4 7 0; ! #X connect 10 5 9 0; ! #X connect 10 6 2 0; ! #X connect 10 7 3 0; ! #X connect 11 0 12 0; ! #X connect 11 1 13 0; ! #X connect 11 2 14 0; ! #X connect 11 3 15 0; ! #X connect 11 4 16 0; ! #X connect 11 5 17 0; ! #X connect 11 6 18 0; ! #X connect 11 7 34 0; ! #X connect 11 8 33 0; ! #X connect 11 9 32 0; ! #X connect 11 10 31 0; ! #X connect 11 11 30 0; ! #X connect 11 12 29 0; ! #X connect 11 13 28 0; ! #X connect 11 14 27 0; ! #X connect 11 15 26 0; ! #X connect 11 16 25 0; ! #X connect 11 17 24 0; ! #X connect 11 18 23 0; ! #X connect 11 19 22 0; ! #X connect 11 20 21 0; ! #X connect 11 21 20 0; ! #X connect 11 22 19 0; ! #X connect 35 0 2 0; --- 1,125 ---- ! #N canvas 107 356 731 483 10; ! #X floatatom 324 292 2 0 0 3 button# - -; ! #X floatatom 381 291 2 0 0 3 button_value - -; ! #X floatatom 70 292 5 0 0 3 y-axis - -; ! #X floatatom 23 292 5 0 0 3 x-axis - -; ! #X floatatom 169 293 3 0 0 3 hat-X - -; ! #X floatatom 215 293 3 0 0 3 hat-Y - -; ! #X floatatom 119 293 5 0 0 3 twist - -; ! #X floatatom 258 292 5 0 0 3 throttle - -; ! #X obj 119 235 linuxjoystick /dev/input/event1; ! #X obj 211 364 select 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21; ! #X obj 211 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 229 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 248 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 266 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 285 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 303 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 322 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 629 403 bng 30 250 50 0 empty empty not_recognized 0 -6 0 8 -261689 -1 -1; ! #X obj 600 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 581 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 563 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 544 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 526 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 507 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 489 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 470 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 452 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 433 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 415 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 396 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 377 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 359 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 340 403 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 366 332 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; ! #X obj 20 9 cnv 15 700 30 empty empty linuxjoystick 20 12 1 16 -257472 ! -66577 0; ! #X text 502 17 related HID objects:; ! #X obj 653 16 linuxhid; ! #X msg 214 136 start; ! #X msg 214 157 stop; ! #X obj 156 118 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X obj 67 118 metro 20; ! #X text 335 194 time between polls (ms); ! #X obj 67 96 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 ! -1; ! #X msg 87 96 stop; ! #X msg 268 194 delay 20; ! #X obj 156 69 key; ! #X msg 278 135 poll; ! #X msg 278 156 nopoll; ! #X text 195 117 start/stop polling (synonyms for the same thing); ! #X obj 156 89 sel 98; ! #X text 202 89 <- (type 'b' for a bang); ! #X connect 0 0 9 0; ! #X connect 1 0 33 0; ! #X connect 8 0 3 0; ! #X connect 8 1 2 0; ! #X connect 8 2 6 0; ! #X connect 8 3 4 0; ! #X connect 8 4 5 0; ! #X connect 8 5 7 0; ! #X connect 8 6 0 0; ! #X connect 8 7 1 0; ! #X connect 9 0 10 0; ! #X connect 9 1 11 0; ! #X connect 9 2 12 0; ! #X connect 9 3 13 0; ! #X connect 9 4 14 0; ! #X connect 9 5 15 0; ! #X connect 9 6 16 0; ! #X connect 9 7 32 0; ! #X connect 9 8 31 0; ! #X connect 9 9 30 0; ! #X connect 9 10 29 0; ! #X connect 9 11 28 0; ! #X connect 9 12 27 0; ! #X connect 9 13 26 0; ! #X connect 9 14 25 0; ! #X connect 9 15 24 0; ! #X connect 9 16 23 0; ! #X connect 9 17 22 0; ! #X connect 9 18 21 0; ! #X connect 9 19 20 0; ! #X connect 9 20 19 0; ! #X connect 9 21 18 0; ! #X connect 9 22 17 0; ! #X connect 33 0 0 0; ! #X connect 37 0 8 0; ! #X connect 38 0 8 0; ! #X connect 39 0 8 0; ! #X connect 40 0 8 0; ! #X connect 42 0 40 0; ! #X connect 43 0 40 0; ! #X connect 44 0 8 0; ! #X connect 45 0 49 0; ! #X connect 46 0 8 0; ! #X connect 47 0 8 0; ! #X connect 49 0 39 0;
Index: linuxmouse.c =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxmouse.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** linuxmouse.c 25 Apr 2003 23:42:19 -0000 1.2 --- linuxmouse.c 17 Nov 2003 21:09:45 -0000 1.3 *************** *** 14,18 **** t_object x_obj; t_int x_fd; ! t_symbol* x_devname; int read_ok; int started; --- 14,18 ---- t_object x_obj; t_int x_fd; ! t_symbol *x_devname; int read_ok; int started; *************** *** 23,27 **** unsigned char x_buttons; unsigned char x_axes; ! }t_linuxmouse;
/*------------------------------------------------------------------------------ --- 23,27 ---- unsigned char x_buttons; unsigned char x_axes; ! } t_linuxmouse;
/*------------------------------------------------------------------------------ *************** *** 29,303 **** */
! //DONE ! static int linuxmouse_close(t_linuxmouse *x) ! { ! DEBUG(post("linuxmouse_close");) ! ! if (x->x_fd <0) return 0; ! ! close (x->x_fd);
! return 1; }
! //DONE ! static int linuxmouse_open(t_linuxmouse *x,t_symbol* s) ! { ! int eventType, eventCode; ! unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; ! char devicename[256] = "Unknown"; ! DEBUG(post("linuxmouse_open");) ! ! linuxmouse_close(x); ! ! /* set obj device name to parameter ! * otherwise set to default ! */ ! if (s != &s_) ! x->x_devname = s; ! else { ! post("You need to set a input device (i.e /dev/input/event0)"); ! } ! ! /* open device */ ! if (x->x_devname) { ! post("opening ..."); ! /* open the linuxmouse device read-only, non-exclusive */ ! x->x_fd = open (x->x_devname->s_name, O_RDONLY | O_NONBLOCK); ! if (x->x_fd >= 0 ) post("done"); ! else post("failed"); ! } ! else { ! return 1; ! } ! ! /* test if device open */ ! if (x->x_fd >= 0) ! post("%s opened",x->x_devname->s_name); ! else { ! post("unable to open %s",x->x_devname->s_name); ! x->x_fd = -1; ! return 0; ! } ! ! /* read input_events from the LINUXMOUSE_DEVICE stream ! * It seems that is just there to flush the event input buffer? ! */ ! while (read (x->x_fd, &(x->x_input_event), sizeof(struct input_event)) > -1); ! ! /* get name of device */ ! ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); ! post ("configuring %s",devicename); ! ! /* get bitmask representing supported events (axes, buttons, etc.) */ ! memset(bitmask, 0, sizeof(bitmask)); ! ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); ! post("Supported events:"); ! ! x->x_axes = 0; ! x->x_buttons = 0; ! ! /* cycle through all possible event types */ ! for (eventType = 0; eventType < EV_MAX; eventType++) { ! if (test_bit(eventType, bitmask[0])) { ! post(" %s (type %d) ", events[eventType] ? events[eventType] : "?", eventType); ! // post("Event type %d",eventType); ! ! /* get bitmask representing supported button types */ ! ioctl(x->x_fd, EVIOCGBIT(eventType, KEY_MAX), bitmask[eventType]); ! ! /* cycle through all possible event codes (axes, keys, etc.) ! * testing to see which are supported ! */ ! for (eventCode = 0; eventCode < KEY_MAX; eventCode++) ! if (test_bit(eventCode, bitmask[eventType])) { ! post(" Event code %d (%s)", eventCode, names[eventType] ? (names[eventType][eventCode] ? names[eventType][eventCode] : "?") : "?");
! if ( eventType == EV_KEY ) ! x->x_buttons++; ! else if ( eventType == EV_REL ) ! x->x_axes++; } - } - } - - post ("\nUsing %d axes and %d buttons.", x->x_axes, x->x_buttons); - post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); - post ("This object is under development! The interface could change at anytime!"); - post ("As I write cross-platform versions, the interface might have to change."); - post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); - - return 1; - } - - - - static int linuxmouse_read(t_linuxmouse *x,int fd) - { - int readBytes; - int axis_num = 0; - t_float button_num = 0; - - if (x->x_fd < 0) return 0; - if (x->read_ok) { - readBytes = read(x->x_fd, &(x->x_input_event), sizeof(struct input_event)); - DEBUG(post("reading %d",readBytes);) - if ( readBytes < 0 ) { - post("linuxmouse: read failed"); - x->read_ok = 0; - return 0; - } - } - if ( x->x_input_event.type == EV_KEY ) { - /* key/button event type */ - switch ( x->x_input_event.code ) { - case BTN_LEFT: - button_num = 0; - break; - case BTN_RIGHT: - button_num = 1; - break; - case BTN_MIDDLE: - button_num = 2; - break; - case BTN_SIDE: - button_num = 3; - break; - case BTN_EXTRA: - button_num = 4; - break; - case BTN_FORWARD: - button_num = 5; - break; - case BTN_BACK: - button_num = 6; - break; - } - outlet_float (x->x_button_val_out, x->x_input_event.value); - outlet_float (x->x_button_num_out, button_num); - } - else if ( x->x_input_event.type == EV_REL ) { - /* Relative Axes Event Type */ - switch ( x->x_input_event.code ) { - case REL_X: - axis_num = 0; - break; - case REL_Y: - axis_num = 1; - break; - case REL_WHEEL: - axis_num = 2; - break; - } - outlet_float (x->x_axis_out[axis_num], (int)x->x_input_event.value); - } - - return 1; }
! /* Actions */ ! ! static void linuxmouse_bang(t_linuxmouse* x) ! { ! DEBUG(post("linuxmouse_bang");) ! ! } ! ! static void linuxmouse_float(t_linuxmouse* x) ! { ! DEBUG(post("linuxmouse_float");) ! }
! // DONE ! void linuxmouse_start(t_linuxmouse* x) ! { ! DEBUG(post("linuxmouse_start");) ! ! if (x->x_fd >= 0 && !x->started) { ! sys_addpollfn(x->x_fd, (t_fdpollfn)linuxmouse_read, x); ! post("linuxmouse: start"); ! x->started = 1; ! } }
! // DONE ! void linuxmouse_stop(t_linuxmouse* x) ! { ! DEBUG(post("linuxmouse_stop");) ! ! if (x->x_fd >= 0 && x->started) { ! sys_rmpollfn(x->x_fd); ! post("linuxmouse: stop"); ! x->started = 0; ! } }
! /* Misc setup functions */ ! ! ! static void linuxmouse_free(t_linuxmouse* x) ! { ! DEBUG(post("linuxmouse_free");)
! if (x->x_fd < 0) return; ! ! linuxmouse_stop(x); ! ! close (x->x_fd); }
! static void *linuxmouse_new(t_symbol *s) ! { ! int i; ! t_linuxmouse *x = (t_linuxmouse *)pd_new(linuxmouse_class);
! DEBUG(post("linuxmouse_new");) ! ! /* init vars */ ! x->x_fd = -1; ! x->read_ok = 1; ! x->started = 0; ! ! /* create outlets for each axis */ ! for (i = 0; i < LINUXMOUSE_AXES; i++) ! x->x_axis_out[i] = outlet_new(&x->x_obj, &s_float); ! ! /* create outlets for buttons */ ! x->x_button_num_out = outlet_new(&x->x_obj, &s_float); ! x->x_button_val_out = outlet_new(&x->x_obj, &s_float); ! ! if (s != &s_) ! x->x_devname = s; ! ! /* Open the device and save settings */ ! ! if (!linuxmouse_open(x,s)) return x; ! ! return (x); }
! ! void linuxmouse_setup(void) ! { ! DEBUG(post("linuxmouse_setup");) ! linuxmouse_class = class_new(gensym("linuxmouse"), ! (t_newmethod)linuxmouse_new, ! (t_method)linuxmouse_free, ! sizeof(t_linuxmouse),0,A_DEFSYM,0); ! ! /* add inlet datatype methods */ ! class_addfloat(linuxmouse_class,(t_method) linuxmouse_float); ! class_addbang(linuxmouse_class,(t_method) linuxmouse_bang); ! ! /* add inlet message methods */ ! class_addmethod(linuxmouse_class, (t_method) linuxmouse_open,gensym("open"),A_DEFSYM); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_close,gensym("close"),0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_start,gensym("start"),0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_stop,gensym("stop"),0); ! }
--- 29,262 ---- */
! /* Actions */ ! void linuxmouse_stop(t_linuxmouse* x) { ! DEBUG(post("linuxmouse_stop"););
! if (x->x_fd >= 0 && x->started) { ! sys_rmpollfn(x->x_fd); ! post("[linuxmouse] stopped"); ! x->started = 0; ! } }
! static int linuxmouse_close(t_linuxmouse *x) { ! DEBUG(post("linuxmouse_close"););
! /* just to be safe, stop it first */ ! linuxmouse_stop(x); ! ! if (x->x_fd < 0) { ! return 0; ! } ! else { ! close (x->x_fd); ! post ("[linuxmouse] closed %s",x->x_devname->s_name); ! return 1; } }
+ static int linuxmouse_open(t_linuxmouse *x, t_symbol *s) { + int eventType, eventCode; + unsigned long bitmask[EV_MAX][NBITS(KEY_MAX)]; + char devicename[256] = "Unknown"; + + DEBUG(post("linuxmouse_open");); + + linuxmouse_close(x);
+ /* For some reason, not initializing x->x_devname causes a seg fault */ + /* on this object, but it works fine on [linuxevent] */ + t_symbol *temp = malloc(20); + temp->s_name = "/dev/input/event0"; + x->x_devname = temp; + + /* set obj device name to parameter + * otherwise set to default + */ + if (s != &s_) x->x_devname = s; + + /* open device */ + if (x->x_devname) { + /* open the device read-only, non-exclusive */ + x->x_fd = open (x->x_devname->s_name, O_RDONLY | O_NONBLOCK); + /* test if device open */ + if (x->x_fd < 0 ) { + post("[linuxmouse] open %s failed",x->x_devname->s_name); + x->x_fd = -1; + return 0; + } + } else { + post("[linuxmouse] no device set: %s",x->x_devname->s_name); + return 1; + } + + + /* read input_events from the LINUXMOUSE_DEVICE stream + * It seems that is just there to flush the event input buffer? + */ + while (read (x->x_fd, &(x->x_input_event), sizeof(struct input_event)) > -1); + + /* get name of device */ + ioctl(x->x_fd, EVIOCGNAME(sizeof(devicename)), devicename); + post ("Configuring %s on %s.",devicename,x->x_devname->s_name); + post("\nSupported events:");
! /* get bitmask representing supported events (axes, buttons, etc.) */ ! memset(bitmask, 0, sizeof(bitmask)); ! ioctl(x->x_fd, EVIOCGBIT(0, EV_MAX), bitmask[0]); ! ! x->x_axes = 0; ! x->x_buttons = 0; ! ! /* cycle through all possible event types */ ! for (eventType = 0; eventType < EV_MAX; eventType++) { ! if (test_bit(eventType, bitmask[0])) { ! post(" %s (type %d) ", events[eventType] ? events[eventType] : "?", eventType); ! // post("Event type %d",eventType); ! ! /* get bitmask representing supported button types */ ! ioctl(x->x_fd, EVIOCGBIT(eventType, KEY_MAX), bitmask[eventType]); ! ! /* cycle through all possible event codes (axes, keys, etc.) ! * testing to see which are supported ! */ ! for (eventCode = 0; eventCode < KEY_MAX; eventCode++) { ! if (test_bit(eventCode, bitmask[eventType])) { ! post(" Event code %d (%s)", eventCode, names[eventType] ? (names[eventType][eventCode] ? names[eventType][eventCode] : "?") : "?"); ! ! if ( eventType == EV_KEY ) ! x->x_buttons++; ! else if ( eventType == EV_REL ) ! x->x_axes++; ! } ! } ! } ! } ! ! post ("\nUsing %d axes and %d buttons.", x->x_axes, x->x_buttons); ! post ("\nWARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING"); ! post ("This object is under development! The interface could change at anytime!"); ! post ("As I write cross-platform versions, the interface might have to change."); ! post ("WARNING * WARNING * WARNING * WARNING * WARNING * WARNING * WARNING\n"); ! ! return 1; }
! static int linuxmouse_read(t_linuxmouse *x,int fd) { ! int axis_num = 0; ! t_float button_num = 0; ! ! if (x->x_fd < 0) return 0; ! ! while (read (x->x_fd, &(x->x_input_event), sizeof(struct input_event)) > -1) { ! if ( x->x_input_event.type == EV_REL ) { ! /* Relative Axes Event Type */ ! switch ( x->x_input_event.code ) { ! case REL_X: ! axis_num = 0; ! break; ! case REL_Y: ! axis_num = 1; ! break; ! case REL_WHEEL: ! axis_num = 2; ! break; ! } ! outlet_float (x->x_axis_out[axis_num], (int)x->x_input_event.value); ! } ! else if ( x->x_input_event.type == EV_KEY ) { ! /* key/button event type */ ! switch ( x->x_input_event.code ) { ! case BTN_LEFT: ! button_num = 0; ! break; ! case BTN_RIGHT: ! button_num = 1; ! break; ! case BTN_MIDDLE: ! button_num = 2; ! break; ! case BTN_SIDE: ! button_num = 3; ! break; ! case BTN_EXTRA: ! button_num = 4; ! break; ! case BTN_FORWARD: ! button_num = 5; ! break; ! case BTN_BACK: ! button_num = 6; ! break; ! } ! outlet_float (x->x_button_val_out, x->x_input_event.value); ! outlet_float (x->x_button_num_out, button_num); ! } ! } ! ! return 1; }
+ void linuxmouse_start(t_linuxmouse* x) { + DEBUG(post("linuxmouse_start"););
! if (x->x_fd >= 0 && !x->started) { ! sys_addpollfn(x->x_fd, (t_fdpollfn)linuxmouse_read, x); ! post("[linuxmouse] started"); ! x->started = 1; ! } else { ! post("You need to set a input device (i.e /dev/input/event0)"); ! } }
! /* setup functions */ ! static void linuxmouse_free(t_linuxmouse* x) { ! DEBUG(post("linuxmouse_free"););
! if (x->x_fd < 0) return; ! linuxmouse_stop(x); ! close (x->x_fd); }
! static void *linuxmouse_new(t_symbol *s) { ! int i; ! t_linuxmouse *x = (t_linuxmouse *)pd_new(linuxmouse_class); ! ! DEBUG(post("linuxmouse_new");); ! ! post("[linuxmouse] %s, written by Hans-Christoph Steiner hans@eds.org",version); ! ! /* init vars */ ! x->x_fd = -1; ! x->read_ok = 1; ! x->started = 0; ! ! /* create outlets for each axis */ ! for (i = 0; i < LINUXMOUSE_AXES; i++) ! x->x_axis_out[i] = outlet_new(&x->x_obj, &s_float); ! ! /* create outlets for buttons */ ! x->x_button_num_out = outlet_new(&x->x_obj, &s_float); ! x->x_button_val_out = outlet_new(&x->x_obj, &s_float);
! if (!linuxmouse_open(x,s)) return x; ! ! return (x); }
! void linuxmouse_setup(void) { ! DEBUG(post("linuxmouse_setup");); ! linuxmouse_class = class_new(gensym("linuxmouse"), ! (t_newmethod)linuxmouse_new, ! (t_method)linuxmouse_free, ! sizeof(t_linuxmouse), 0, A_DEFSYM, 0); ! ! /* add inlet message methods */ ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_open,gensym("open"),A_DEFSYM,0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_close,gensym("close"),0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_start,gensym("start"),0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_stop,gensym("stop"),0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_start,gensym("poll"),0); ! class_addmethod(linuxmouse_class,(t_method) linuxmouse_stop,gensym("nopoll"),0); }
Index: linuxmouse-help.pd =================================================================== RCS file: /cvsroot/pure-data/externals/hcs/linuxmouse-help.pd,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** linuxmouse-help.pd 17 Nov 2003 03:04:55 -0000 1.1 --- linuxmouse-help.pd 17 Nov 2003 21:09:45 -0000 1.2 *************** *** 1,11 **** ! #N canvas 454 205 450 300 10; ! #X floatatom 258 160 5 0 0 3 button# - -; ! #X floatatom 321 162 5 0 0 3 button_value - -; ! #X floatatom 175 160 2 0 0 3 wheel - -; ! #X floatatom 99 161 4 0 0 3 y-axis - -; ! #X floatatom 24 162 4 0 0 3 x-axis - -; ! #X obj 75 110 linuxmouse /dev/input/event0; ! #X msg 125 40 start; ! #X msg 136 78 stop; #X connect 5 0 4 0; #X connect 5 1 3 0; --- 1,32 ---- ! #N canvas 112 187 450 441 10; ! #X floatatom 238 220 5 0 0 3 button# - -; ! #X floatatom 299 220 5 0 0 3 button_value - -; ! #X floatatom 190 220 2 0 0 3 wheel - -; ! #X floatatom 137 220 4 0 0 3 y-axis - -; ! #X floatatom 79 220 4 0 0 3 x-axis - -; ! #X obj 95 193 linuxmouse /dev/input/event0; ! #X obj 18 6 cnv 15 400 30 empty empty linuxmouse 20 12 1 16 -225280 ! -66577 0; ! #X text 206 17 related HID objects:; ! #X obj 357 16 linuxhiderfic; ! #X text 24 263 [linuxmouse] takes events directly from a Linux event ! device , so that you get mouse data regardless of whether Pd has focus. ! Also , the data from the event system is relative and limited to the ! screen size.; ! #X msg 51 71 start; ! #X msg 51 93 stop; ! #X msg 115 70 poll; ! #X msg 115 92 nopoll; ! #X text 24 335 Rather than polling like the other linuxhid objects ! , [linuxmouse] uses a pollfn so it receives events as they happen. ! A pollfn listens to a network socket , and takes action upon activity. ! Since all mouse events go through the network socket between pd and ! pd-gui , this works for responding to mouse events.; ! #X msg 158 165 close; ! #X text 179 91 (synonyms for the same actions); ! #X text 182 75 start/stop polling; ! #X msg 147 122 open; ! #X msg 152 142 open /dev/input/event1; ! #X text 183 123 opens the previous device; #X connect 5 0 4 0; #X connect 5 1 3 0; *************** *** 13,16 **** #X connect 5 3 0 0; #X connect 5 4 1 0; ! #X connect 6 0 5 0; ! #X connect 7 0 5 0; --- 34,42 ---- #X connect 5 3 0 0; #X connect 5 4 1 0; ! #X connect 10 0 5 0; ! #X connect 11 0 5 0; ! #X connect 12 0 5 0; ! #X connect 13 0 5 0; ! #X connect 15 0 5 0; ! #X connect 18 0 5 0; ! #X connect 19 0 5 0;