Mercurial > sdl-ios-xcode
comparison src/haptic/linux/SDL_syshaptic.c @ 2496:8f840a6cdf01 gsoc2008_force_feedback
Using errno for more verbosity in errors.
author | Edgar Simo <bobbens@gmail.com> |
---|---|
date | Thu, 03 Jul 2008 21:03:25 +0000 |
parents | 66c02abeef0e |
children | 5251d0510b7e |
comparison
equal
deleted
inserted
replaced
2495:66c02abeef0e | 2496:8f840a6cdf01 |
---|---|
35 #include <sys/types.h> | 35 #include <sys/types.h> |
36 #include <sys/stat.h> | 36 #include <sys/stat.h> |
37 #include <fcntl.h> | 37 #include <fcntl.h> |
38 #include <linux/limits.h> | 38 #include <linux/limits.h> |
39 #include <string.h> | 39 #include <string.h> |
40 #include <errno.h> | |
40 | 41 |
41 | 42 |
42 #define MAX_HAPTICS 32 | 43 #define MAX_HAPTICS 32 |
43 | 44 |
44 | 45 |
86 unsigned long features[1 + FF_MAX/sizeof(unsigned long)]; | 87 unsigned long features[1 + FF_MAX/sizeof(unsigned long)]; |
87 | 88 |
88 ret = 0; | 89 ret = 0; |
89 | 90 |
90 if (ioctl(fd, EVIOCGBIT(EV_FF, sizeof(unsigned long) * 4), features) < 0) { | 91 if (ioctl(fd, EVIOCGBIT(EV_FF, sizeof(unsigned long) * 4), features) < 0) { |
91 SDL_SetError("Unable to get device's haptic abilities."); | 92 SDL_SetError("Unable to get device's haptic abilities: %s", strerror(errno)); |
92 return -1; | 93 return -1; |
93 } | 94 } |
94 | 95 |
95 EV_TEST(FF_CONSTANT, SDL_HAPTIC_CONSTANT); | 96 EV_TEST(FF_CONSTANT, SDL_HAPTIC_CONSTANT); |
96 EV_TEST(FF_PERIODIC, SDL_HAPTIC_SINE | | 97 EV_TEST(FF_PERIODIC, SDL_HAPTIC_SINE | |
210 haptic->hwdata->fd = fd; | 211 haptic->hwdata->fd = fd; |
211 haptic->supported = EV_IsHaptic(fd); | 212 haptic->supported = EV_IsHaptic(fd); |
212 | 213 |
213 /* Set the effects */ | 214 /* Set the effects */ |
214 if (ioctl(fd, EVIOCGEFFECTS, &haptic->neffects) < 0) { | 215 if (ioctl(fd, EVIOCGEFFECTS, &haptic->neffects) < 0) { |
215 SDL_SetError("Unable to query haptic device memory."); | 216 SDL_SetError("Unable to query haptic device memory: %s", strerror(errno)); |
216 goto open_err; | 217 goto open_err; |
217 } | 218 } |
218 haptic->effects = (struct haptic_effect *) | 219 haptic->effects = (struct haptic_effect *) |
219 SDL_malloc(sizeof(struct haptic_effect) * haptic->neffects); | 220 SDL_malloc(sizeof(struct haptic_effect) * haptic->neffects); |
220 if (haptic->effects == NULL) { | 221 if (haptic->effects == NULL) { |
247 int fd; | 248 int fd; |
248 | 249 |
249 /* Open the character device */ | 250 /* Open the character device */ |
250 fd = open(SDL_hapticlist[haptic->index].fname, O_RDWR, 0); | 251 fd = open(SDL_hapticlist[haptic->index].fname, O_RDWR, 0); |
251 if (fd < 0) { | 252 if (fd < 0) { |
252 SDL_SetError("Unable to open %s\n", SDL_hapticlist[haptic->index]); | 253 SDL_SetError("Unable to open %s: %s", |
254 SDL_hapticlist[haptic->index], strerror(errno)); | |
253 return -1; | 255 return -1; |
254 } | 256 } |
255 | 257 |
256 return SDL_SYS_HapticOpenFromFD(haptic,fd); | 258 return SDL_SYS_HapticOpenFromFD(haptic,fd); |
257 } | 259 } |
475 | 477 |
476 break; | 478 break; |
477 | 479 |
478 | 480 |
479 default: | 481 default: |
480 SDL_SetError("Unknown haptic effect type."); | 482 SDL_SetError("Unknown haptic effect type"); |
481 return -1; | 483 return -1; |
482 } | 484 } |
483 | 485 |
484 return 0; | 486 return 0; |
485 } | 487 } |
509 } | 511 } |
510 linux_effect->id = -1; /* Have the kernel give it an id */ | 512 linux_effect->id = -1; /* Have the kernel give it an id */ |
511 | 513 |
512 /* Upload the effect */ | 514 /* Upload the effect */ |
513 if (ioctl(haptic->hwdata->fd, EVIOCSFF, linux_effect) < 0) { | 515 if (ioctl(haptic->hwdata->fd, EVIOCSFF, linux_effect) < 0) { |
514 SDL_SetError("Error uploading effect to the haptic device."); | 516 SDL_SetError("Error uploading effect to the haptic device: %s", strerror(errno)); |
515 goto new_effect_err; | 517 goto new_effect_err; |
516 } | 518 } |
517 | 519 |
518 return 0; | 520 return 0; |
519 | 521 |
541 } | 543 } |
542 linux_effect.id = effect->hweffect->effect.id; | 544 linux_effect.id = effect->hweffect->effect.id; |
543 | 545 |
544 /* See if it can be uploaded. */ | 546 /* See if it can be uploaded. */ |
545 if (ioctl(haptic->hwdata->fd, EVIOCSFF, &linux_effect) < 0) { | 547 if (ioctl(haptic->hwdata->fd, EVIOCSFF, &linux_effect) < 0) { |
546 SDL_SetError("Error updating the haptic effect."); | 548 SDL_SetError("Error updating the haptic effect: %s", strerror(errno)); |
547 return -1; | 549 return -1; |
548 } | 550 } |
549 | 551 |
550 /* Copy the new effect into memory. */ | 552 /* Copy the new effect into memory. */ |
551 SDL_memcpy( &effect->hweffect->effect, &linux_effect, sizeof(struct ff_effect) ); | 553 SDL_memcpy( &effect->hweffect->effect, &linux_effect, sizeof(struct ff_effect) ); |
566 run.type = EV_FF; | 568 run.type = EV_FF; |
567 run.code = effect->hweffect->effect.id; | 569 run.code = effect->hweffect->effect.id; |
568 run.value = 1; | 570 run.value = 1; |
569 | 571 |
570 if (write(haptic->hwdata->fd, (const void*) &run, sizeof(run)) < 0) { | 572 if (write(haptic->hwdata->fd, (const void*) &run, sizeof(run)) < 0) { |
571 SDL_SetError("Unable to run the haptic effect."); | 573 SDL_SetError("Unable to run the haptic effect: %s", strerror(errno)); |
572 return -1; | 574 return -1; |
573 } | 575 } |
574 | 576 |
575 return 0; | 577 return 0; |
576 } | 578 } |
587 stop.type = EV_FF; | 589 stop.type = EV_FF; |
588 stop.code = effect->hweffect->effect.id; | 590 stop.code = effect->hweffect->effect.id; |
589 stop.value = 0; | 591 stop.value = 0; |
590 | 592 |
591 if (write(haptic->hwdata->fd, (const void*) &stop, sizeof(stop)) < 0) { | 593 if (write(haptic->hwdata->fd, (const void*) &stop, sizeof(stop)) < 0) { |
592 SDL_SetError("Unable to stop the haptic effect."); | 594 SDL_SetError("Unable to stop the haptic effect: %s", strerror(errno)); |
593 return -1; | 595 return -1; |
594 } | 596 } |
595 | 597 |
596 return 0; | 598 return 0; |
597 } | 599 } |
602 */ | 604 */ |
603 void | 605 void |
604 SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect * effect) | 606 SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect * effect) |
605 { | 607 { |
606 if (ioctl(haptic->hwdata->fd, EVIOCRMFF, effect->hweffect->effect.id) < 0) { | 608 if (ioctl(haptic->hwdata->fd, EVIOCRMFF, effect->hweffect->effect.id) < 0) { |
607 SDL_SetError("Error removing the effect from the haptic device."); | 609 SDL_SetError("Error removing the effect from the haptic device: %s", |
610 strerror(errno)); | |
608 } | 611 } |
609 SDL_free(effect->hweffect); | 612 SDL_free(effect->hweffect); |
610 effect->hweffect = NULL; | 613 effect->hweffect = NULL; |
611 } | 614 } |
612 | 615 |
647 ie.type = EV_FF; | 650 ie.type = EV_FF; |
648 ie.code = FF_GAIN; | 651 ie.code = FF_GAIN; |
649 ie.value = (0xFFFFUL * gain) / 100; | 652 ie.value = (0xFFFFUL * gain) / 100; |
650 | 653 |
651 if (write(haptic->hwdata->fd, &ie, sizeof(ie)) < 0) { | 654 if (write(haptic->hwdata->fd, &ie, sizeof(ie)) < 0) { |
652 SDL_SetError("Error setting gain."); | 655 SDL_SetError("Error setting gain: %s", strerror(errno)); |
653 return -1; | 656 return -1; |
654 } | 657 } |
655 | 658 |
656 return 0; | 659 return 0; |
657 } | 660 } |
668 ie.type = EV_FF; | 671 ie.type = EV_FF; |
669 ie.code = FF_AUTOCENTER; | 672 ie.code = FF_AUTOCENTER; |
670 ie.value = (0xFFFFUL * autocenter) / 100; | 673 ie.value = (0xFFFFUL * autocenter) / 100; |
671 | 674 |
672 if (write(haptic->hwdata->fd, &ie, sizeof(ie)) < 0) { | 675 if (write(haptic->hwdata->fd, &ie, sizeof(ie)) < 0) { |
673 SDL_SetError("Error setting autocenter."); | 676 SDL_SetError("Error setting autocenter: %s", strerror(errno)); |
674 return -1; | 677 return -1; |
675 } | 678 } |
676 | 679 |
677 return 0; | 680 return 0; |
678 } | 681 } |