aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2004-05-28 01:01:36 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2004-05-28 01:01:36 +0000
commit77f6224967e5cd688026b5c3f988708b6d6b05e4 (patch)
tree26d9cf5a4609e7a92d16cc9dc394117e75504cb0
parent51985f6defbc62998f4b18ecb3d2b2db8b7d5165 (diff)
added [command( msg and cleaned up code
svn path=/trunk/externals/hcs/; revision=1780
-rw-r--r--ifeel-help.pd63
-rw-r--r--ifeel.c291
2 files changed, 205 insertions, 149 deletions
diff --git a/ifeel-help.pd b/ifeel-help.pd
index 7001c79..0b9e6e9 100644
--- a/ifeel-help.pd
+++ b/ifeel-help.pd
@@ -1,27 +1,40 @@
-#N canvas 736 320 450 300 10;
-#X obj 105 228 ifeel /dev/input/ifeel0;
-#X obj 160 82 hsl 128 20 0 255 0 0 empty empty interval_(0-255) 6 8
-32 8 -225271 -1 -1 12700 0;
-#X obj 212 130 hsl 128 20 0 255 0 0 empty empty count_(0-255) 6 8 32
-8 -261681 -1 -1 0 0;
-#X obj 264 178 hsl 128 20 0 1 0 0 empty empty level_(0-1) 6 8 32 8
--261689 -1 -1 12700 0;
-#X obj 61 157 bng 25 250 50 0 empty empty empty 0 -6 32 8 -24198 -1
+#N canvas 208 93 480 482 10;
+#X obj 187 324 ifeel /dev/input/ifeel0;
+#X obj 242 224 hsl 128 20 0 255 0 0 empty empty interval_(0-255) 6
+10 1 10 -225271 -1 -1 0 0;
+#X obj 294 253 hsl 128 20 0 255 0 0 empty empty count_(0-255) 6 10
+1 10 -261681 -1 -1 0 0;
+#X obj 346 282 hsl 128 20 0 1 0 0 empty empty strength_(0-1) 6 10 1
+10 -261689 -1 -1 0 0;
+#X obj 182 46 bng 25 250 50 0 empty empty empty 0 -6 0 8 -24198 -1
-1;
-#X obj 105 157 bng 25 250 50 0 empty empty empty 0 -6 32 8 -258699
--1 -1;
-#X msg 105 187 stop;
-#X msg 61 187 start;
-#X obj 261 201 nbx 5 14 -1e+37 1e+37 0 0 pack_bang_env empty empty
-0 -6 33 10 -233017 -1 -1 1 256;
-#X obj 209 153 nbx 3 14 -1e+37 1e+37 0 0 pack_bang_env empty empty
-0 -6 33 10 -233017 -1 -1 0 256;
-#X obj 157 105 nbx 3 14 -1e+37 1e+37 0 0 pack_bang_env empty empty
-0 -6 33 10 -233017 -1 -1 255 256;
-#X obj 120 9 cnv 15 20 20 empty empty ifeel 4 12 33 14 -228992 -66577
+#X obj 226 46 bng 25 250 50 0 empty empty empty 0 -6 0 8 -258699 -1
+-1;
+#X msg 226 76 stop;
+#X msg 182 76 start;
+#X obj 343 305 nbx 5 14 -1e+37 1e+37 0 0 pack_bang_env empty empty
+0 -6 0 10 -233017 -1 -1 0 256;
+#X obj 291 276 nbx 3 14 -1e+37 1e+37 0 0 pack_bang_env empty empty
+0 -6 0 10 -233017 -1 -1 0 256;
+#X obj 239 247 nbx 3 14 -1e+37 1e+37 0 0 pack_bang_env empty empty
+0 -6 0 10 -233017 -1 -1 0 256;
+#X obj 3 4 cnv 15 470 30 empty empty [ifeel] 4 12 1 16 -228992 -66577
0;
-#X text 190 15 control the pulse in an iFeel mouse;
-#X obj 4 13 force-feedback;
+#X text 73 10 control the pulse in an iFeel mouse;
+#X text 37 359 If you feed data to the ifeel mouse too quickly \, it
+has a tendency to crash the whole machine. I suspect a bug in the kernel
+module ifeel.o.;
+#X text 13 449 by Hans-Christoph Steiner <hans@at.or.at>;
+#X obj 324 416 all_about_haptics;
+#X text 201 417 For more info:;
+#X msg 251 168 strength 0.56;
+#X msg 234 124 interval 73;
+#X msg 243 147 count 14;
+#X msg 26 271 command 50 10 1;
+#X text 19 223 interval count strength;
+#X text 1 205 Or give a single command:;
+#X msg 26 249 command 25 255 1;
+#X msg 26 293 command 0 0 0;
#X connect 1 0 10 0;
#X connect 2 0 9 0;
#X connect 3 0 8 0;
@@ -32,3 +45,9 @@
#X connect 8 0 0 3;
#X connect 9 0 0 2;
#X connect 10 0 0 1;
+#X connect 17 0 0 0;
+#X connect 18 0 0 0;
+#X connect 19 0 0 0;
+#X connect 20 0 0 0;
+#X connect 23 0 0 0;
+#X connect 24 0 0 0;
diff --git a/ifeel.c b/ifeel.c
index bec1148..b1caf94 100644
--- a/ifeel.c
+++ b/ifeel.c
@@ -20,9 +20,9 @@
*
* there is a difference in the naming schemes of the ifeel driver and this
* object. The ifeel driver uses strength, delay, and count. This object
- * uses level, interval, and count.
+ * uses strength, interval, and count.
*
- * strength/level - the strength of the pulse (I am searching for a better word)
+ * strength - the strength of the pulse (I am searching for a better word)
* delay/interval - the interval in between each pulse
* count - the total number of pulses to do
*/
@@ -50,7 +50,8 @@
static t_class *ifeel_class;
-typedef struct _ifeel {
+typedef struct _ifeel
+{
t_object x_obj;
int x_fd;
struct ifeel_command x_ifeel_command;
@@ -62,22 +63,26 @@ typedef struct _ifeel {
support functions
******************************************************************************/
-void ifeel_playcommand(t_ifeel *x) {
+void ifeel_playcommand(t_ifeel *x)
+{
/* const struct timespec *requested_time; */
/* struct timespec *remaining; */
-
+
#ifdef __linux__
- if (ioctl(x->x_fd, USB_IFEEL_BUZZ_IOCTL, &x->x_ifeel_command) < 0) {
- post("x->x_fd: %d",x->x_fd);
- post("level: %d interval: %d count: %d",x->x_ifeel_command.strength,x->x_ifeel_command.delay,x->x_ifeel_command.count);
- post("ERROR %s", strerror(errno));
- close(x->x_fd);
- }
-#endif
-
- DEBUG(
- post("level: %d interval: %d count: %d",x->x_ifeel_command.strength,x->x_ifeel_command.delay,x->x_ifeel_command.count);
- post("");)
+ if (ioctl(x->x_fd, USB_IFEEL_BUZZ_IOCTL, &x->x_ifeel_command) < 0)
+ {
+ post("x->x_fd: %d",x->x_fd);
+ post("strength: %d interval: %d count: %d",
+ x->x_ifeel_command.strength,x->x_ifeel_command.delay,x->x_ifeel_command.count);
+ post("ERROR %s", strerror(errno));
+ close(x->x_fd);
+ }
+#endif /* __linux__ */
+
+ DEBUG(
+ post("strength: %d interval: %d count: %d",
+ x->x_ifeel_command.strength,x->x_ifeel_command.delay,x->x_ifeel_command.count);
+ post(""););
}
@@ -95,53 +100,80 @@ void ifeel_start(t_ifeel *x) {
ifeel_playcommand(x);
}
-void ifeel_stop(t_ifeel *x) {
- DEBUG(post("ifeel_stop");)
-
- /*
- * there is no 'stop' ioctl, so set everything to zero
- * to achieve the same effect
- */
- x->x_ifeel_command.strength = 0;
- x->x_ifeel_command.delay = 0;
- x->x_ifeel_command.count = 0;
-
- ifeel_playcommand(x);
+void ifeel_stop(t_ifeel *x)
+{
+ DEBUG(post("ifeel_stop"););
+ struct ifeel_command temp_ifeel_command;
+
+/* store previous command for restoring after stop */
+ temp_ifeel_command.strength = x->x_ifeel_command.strength;
+ temp_ifeel_command.delay = x->x_ifeel_command.delay;
+ temp_ifeel_command.count = x->x_ifeel_command.count;
+
+ /*
+ * there is no 'stop' ioctl, so set everything to zero
+ * to achieve the same effect
+ */
+ x->x_ifeel_command.strength = 0;
+ x->x_ifeel_command.delay = 0;
+ x->x_ifeel_command.count = 0;
+
+ ifeel_playcommand(x);
+
+ /* restore previous command so the start msg will work */
+ x->x_ifeel_command.strength = temp_ifeel_command.strength;
+ x->x_ifeel_command.delay = temp_ifeel_command.delay;
+ x->x_ifeel_command.count = temp_ifeel_command.count;
}
-void ifeel_level(t_ifeel *x, t_floatarg level) {
- DEBUG(post("ifeel_level");)
-
- /*
- * make sure its in the proper range
- * this object takes floats 0-1
- * the ifeel driver takes ints 0-255
- */
- level = level * 255;
- level = (level > 255 ? 255 : level);
- level = (level < 0 ? 0 : level);
+void ifeel_strength(t_ifeel *x, t_floatarg strength)
+{
+ DEBUG(post("ifeel_strength"););
+
+/*
+ * make sure its in the proper range
+ * this object takes floats 0-1
+ * the ifeel driver takes ints 0-255
+ */
+ strength = strength * 255;
+ strength = (strength > 255 ? 255 : strength);
+ strength = (strength < 0 ? 0 : strength);
- x->x_ifeel_command.strength = (unsigned int)level;
+ x->x_ifeel_command.strength = (unsigned int)strength;
}
-void ifeel_interval(t_ifeel *x, t_floatarg interval) {
- DEBUG(post("ifeel_interval");)
-
- interval = (interval < 0 ? 0 : interval);
-
- x->x_ifeel_command.delay = (unsigned int)interval;
+void ifeel_interval(t_ifeel *x, t_floatarg interval)
+{
+ DEBUG(post("ifeel_interval"););
+
+ interval = (interval < 0 ? 0 : interval);
+
+ x->x_ifeel_command.delay = (unsigned int)interval;
}
-void ifeel_count(t_ifeel *x, t_floatarg count ) {
- DEBUG(post("ifeel_count");)
-
- count = (count < 0 ? 0 : count);
+void ifeel_count(t_ifeel *x, t_floatarg count )
+{
+ DEBUG(post("ifeel_count"););
+
+ count = (count < 0 ? 0 : count);
+
+ x->x_ifeel_command.count = (unsigned int)count;
+}
- x->x_ifeel_command.count = (unsigned int)count;
+void ifeel_command(t_ifeel *x, t_floatarg interval, t_floatarg count, t_floatarg strength)
+{
+ DEBUG(post("ifeel_command"););
+
+ ifeel_strength(x,strength);
+ ifeel_interval(x,interval);
+ ifeel_count(x,count);
+
+ ifeel_playcommand(x);
}
-static int ifeel_open(t_ifeel *x) {
- return 1;
+static int ifeel_open(t_ifeel *x)
+{
+ return 1;
}
/******************************************************************************
@@ -150,27 +182,27 @@ static int ifeel_open(t_ifeel *x) {
void ifeel_free(t_ifeel *x)
{
- DEBUG(post("ifeel_free");)
-
- /* stop effect */
- ifeel_stop(x);
-
- /* close device */
- close(x->x_fd);
+ DEBUG(post("ifeel_free"););
+
+ /* stop effect */
+ ifeel_stop(x);
+
+ /* close device */
+ close(x->x_fd);
}
-void *ifeel_new(t_symbol *device, t_floatarg level, t_floatarg interval, t_floatarg count) {
- DEBUG(post("ifeel_new");)
-
- t_ifeel *x = (t_ifeel *)pd_new(ifeel_class);
+void *ifeel_new(t_symbol *device, t_floatarg strength, t_floatarg interval, t_floatarg count) {
+ DEBUG(post("ifeel_new"););
+
+ t_ifeel *x = (t_ifeel *)pd_new(ifeel_class);
- post("iFeel mouse, by Hans-Christoph Steiner <hans@eds.org>");
- 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");
- post("");
+ post("iFeel mouse, by Hans-Christoph Steiner <hans@eds.org>");
+ 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");
+ post("");
#ifndef __linux__
post(" !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !! WARNING !!");
post(" This is a dummy, since this object only works with a Linux kernel!");
@@ -181,68 +213,73 @@ void *ifeel_new(t_symbol *device, t_floatarg level, t_floatarg interval, t_float
* init to zero so I can use the ifeel_* methods to set the
* struct with the argument values
*/
- x->x_ifeel_command.strength = 0;
- x->x_ifeel_command.delay = 0;
- x->x_ifeel_command.count = 0;
-
- inlet_new(&x->x_obj,
- &x->x_obj.ob_pd,
- gensym("float"),
- gensym("interval"));
- inlet_new(&x->x_obj,
- &x->x_obj.ob_pd,
- gensym("float"),
- gensym("count"));
- inlet_new(&x->x_obj,
- &x->x_obj.ob_pd,
- gensym("float"),
- gensym("level"));
-
- if (device != &s_) {
- post("Using %s",device->s_name);
-
- /* x->x_fd = open(IFEEL_DEVICE, O_RDWR); */
- if ((x->x_fd = open((char *) device->s_name, O_RDWR | O_NONBLOCK, 0)) <= 0) {
- printf("ERROR %s\n", strerror(errno));
- return 0;
- }
-
-/* ifeel_level(x,level); */
+ x->x_ifeel_command.strength = 0;
+ x->x_ifeel_command.delay = 0;
+ x->x_ifeel_command.count = 0;
+
+ inlet_new(&x->x_obj,
+ &x->x_obj.ob_pd,
+ gensym("float"),
+ gensym("interval"));
+ inlet_new(&x->x_obj,
+ &x->x_obj.ob_pd,
+ gensym("float"),
+ gensym("count"));
+ inlet_new(&x->x_obj,
+ &x->x_obj.ob_pd,
+ gensym("float"),
+ gensym("strength"));
+
+ if (device != &s_)
+ {
+ post("Using %s",device->s_name);
+
+ /* x->x_fd = open(IFEEL_DEVICE, O_RDWR); */
+ if ((x->x_fd = open((char *) device->s_name, O_RDWR | O_NONBLOCK, 0)) <= 0)
+ {
+ printf("ERROR %s\n", strerror(errno));
+ return 0;
+ }
+
+/* ifeel_strength(x,strength); */
/* ifeel_interval(x,interval); */
/* ifeel_count(x,count); */
- }
-
- else {
- post("ifeel: You need to set an ifeel device (i.e /dev/input/ifeel0)");
- }
-
+ }
+
+ else
+ {
+ post("ifeel: You need to set an ifeel device (i.e /dev/input/ifeel0)");
+ }
+
return (void*)x;
}
void ifeel_setup(void)
{
- DEBUG(post("ifeel_setup");)
-
- ifeel_class = class_new(gensym("ifeel"),
- (t_newmethod)ifeel_new,
- (t_method)ifeel_free,
- sizeof(t_ifeel),
- CLASS_DEFAULT,
- A_DEFSYMBOL,
- A_DEFFLOAT,
- A_DEFFLOAT,
- A_DEFFLOAT,
- 0);
-
- class_addbang(ifeel_class,ifeel_start);
-
- class_addmethod(ifeel_class, (t_method)ifeel_start,gensym("start"),0);
- class_addmethod(ifeel_class, (t_method)ifeel_stop,gensym("stop"),0);
-
- class_addmethod(ifeel_class, (t_method)ifeel_level, gensym("level"), A_DEFFLOAT,0);
- class_addmethod(ifeel_class, (t_method)ifeel_interval,gensym("interval"),A_DEFFLOAT,0);
- class_addmethod(ifeel_class, (t_method)ifeel_count,gensym("count"),A_DEFFLOAT,0);
-
- }
+ DEBUG(post("ifeel_setup"););
+
+ ifeel_class = class_new(gensym("ifeel"),
+ (t_newmethod)ifeel_new,
+ (t_method)ifeel_free,
+ sizeof(t_ifeel),
+ CLASS_DEFAULT,
+ A_DEFSYMBOL,
+ A_DEFFLOAT,
+ A_DEFFLOAT,
+ A_DEFFLOAT,
+ 0);
+
+ class_addbang(ifeel_class,ifeel_start);
+
+ class_addmethod(ifeel_class, (t_method)ifeel_start,gensym("start"),0);
+ class_addmethod(ifeel_class, (t_method)ifeel_stop,gensym("stop"),0);
+
+ class_addmethod(ifeel_class, (t_method)ifeel_command,gensym("command"),
+ A_DEFFLOAT,A_DEFFLOAT,A_DEFFLOAT,0);
+
+ class_addmethod(ifeel_class, (t_method)ifeel_strength,gensym("strength"),A_DEFFLOAT,0);
+ class_addmethod(ifeel_class, (t_method)ifeel_interval,gensym("interval"),A_DEFFLOAT,0);
+ class_addmethod(ifeel_class, (t_method)ifeel_count,gensym("count"),A_DEFFLOAT,0);
+}