Mercurial > sdl-ios-xcode
comparison src/haptic/linux/SDL_syshaptic.c @ 2480:b883974445fc gsoc2008_force_feedback
Some more error reporting.
Added periodic effect.
Confirmed it works.
author | Edgar Simo <bobbens@gmail.com> |
---|---|
date | Tue, 01 Jul 2008 09:22:22 +0000 |
parents | b9eb2cfe16cd |
children | 5d0ea4576f20 |
comparison
equal
deleted
inserted
replaced
2479:b9eb2cfe16cd | 2480:b883974445fc |
---|---|
33 #include <sys/types.h> | 33 #include <sys/types.h> |
34 #include <sys/stat.h> | 34 #include <sys/stat.h> |
35 #include <fcntl.h> | 35 #include <fcntl.h> |
36 #include <linux/limits.h> | 36 #include <linux/limits.h> |
37 #include <string.h> | 37 #include <string.h> |
38 #include <errno.h> | |
38 | 39 |
39 | 40 |
40 #define MAX_HAPTICS 32 | 41 #define MAX_HAPTICS 32 |
41 | 42 |
42 | 43 |
272 | 273 |
273 /* | 274 /* |
274 * Initializes the linux effect struct from a haptic_effect. | 275 * Initializes the linux effect struct from a haptic_effect. |
275 */ | 276 */ |
276 static int | 277 static int |
277 SDL_SYS_ToFFEffect( struct ff_effect * dest, struct haptic_effect * src ) | 278 SDL_SYS_ToFFEffect( struct ff_effect * dest, SDL_HapticEffect * src ) |
278 { | 279 { |
280 SDL_HapticConstant *constant; | |
281 SDL_HapticPeriodic *periodic; | |
282 | |
283 /* Clear up */ | |
279 SDL_memset(dest, 0, sizeof(struct ff_effect)); | 284 SDL_memset(dest, 0, sizeof(struct ff_effect)); |
280 switch (src->effect.type) { | 285 |
286 switch (src->type) { | |
281 case SDL_HAPTIC_CONSTANT: | 287 case SDL_HAPTIC_CONSTANT: |
288 constant = &src->constant; | |
289 | |
290 /* Header */ | |
282 dest->type = FF_CONSTANT; | 291 dest->type = FF_CONSTANT; |
292 dest->direction = constant->direction; | |
293 | |
294 /* Replay */ | |
295 dest->replay.length = constant->length; | |
296 dest->replay.delay = constant->delay; | |
297 | |
298 /* Trigger */ | |
299 dest->trigger.button = constant->button; | |
300 dest->trigger.interval = constant->interval; | |
301 | |
302 /* Constant */ | |
303 dest->u.constant.level = constant->level; | |
304 | |
305 /* Envelope */ | |
306 dest->u.constant.envelope.attack_length = constant->attack_length; | |
307 dest->u.constant.envelope.attack_level = constant->attack_level; | |
308 dest->u.constant.envelope.fade_length = constant->fade_length; | |
309 dest->u.constant.envelope.fade_level = constant->fade_level; | |
310 | |
311 break; | |
312 | |
313 case SDL_HAPTIC_PERIODIC: | |
314 periodic = &src->periodic; | |
315 | |
316 /* Header */ | |
317 dest->type = FF_PERIODIC; | |
318 dest->direction = periodic->direction; | |
319 | |
320 /* Replay */ | |
321 dest->replay.length = periodic->length; | |
322 dest->replay.delay = periodic->delay; | |
323 | |
324 /* Trigger */ | |
325 dest->trigger.button = periodic->button; | |
326 dest->trigger.interval = periodic->interval; | |
327 | |
328 /* Constant */ | |
329 dest->u.periodic.waveform = periodic->waveform; | |
330 dest->u.periodic.period = periodic->period; | |
331 dest->u.periodic.magnitude = periodic->magnitude; | |
332 dest->u.periodic.offset = periodic->offset; | |
333 dest->u.periodic.phase = periodic->phase; | |
334 | |
335 /* Envelope */ | |
336 dest->u.periodic.envelope.attack_length = periodic->attack_length; | |
337 dest->u.periodic.envelope.attack_level = periodic->attack_level; | |
338 dest->u.periodic.envelope.fade_length = periodic->fade_length; | |
339 dest->u.periodic.envelope.fade_level = periodic->fade_level; | |
283 | 340 |
284 break; | 341 break; |
285 | 342 |
286 default: | 343 default: |
287 SDL_SetError("Unknown haptic effect type."); | 344 SDL_SetError("Unknown haptic effect type."); |
293 | 350 |
294 /* | 351 /* |
295 * Creates a new haptic effect. | 352 * Creates a new haptic effect. |
296 */ | 353 */ |
297 int | 354 int |
298 SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect * effect) | 355 SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect * effect, |
299 { | 356 SDL_HapticEffect * base) |
357 { | |
358 struct ff_effect * linux_effect; | |
359 | |
300 /* Allocate the hardware effect */ | 360 /* Allocate the hardware effect */ |
301 effect->hweffect = (struct haptic_hweffect *) | 361 effect->hweffect = (struct haptic_hweffect *) |
302 SDL_malloc(sizeof(struct haptic_hweffect)); | 362 SDL_malloc(sizeof(struct haptic_hweffect)); |
303 if (effect->hweffect == NULL) { | 363 if (effect->hweffect == NULL) { |
304 SDL_OutOfMemory(); | 364 SDL_OutOfMemory(); |
305 return -1; | 365 return -1; |
306 } | 366 } |
307 | 367 |
308 /* Prepare the ff_effect */ | 368 /* Prepare the ff_effect */ |
309 if (SDL_SYS_ToFFEffect( &effect->hweffect->effect, effect ) != 0) { | 369 linux_effect = &effect->hweffect->effect; |
370 if (SDL_SYS_ToFFEffect( linux_effect, base ) != 0) { | |
310 return -1; | 371 return -1; |
311 } | 372 } |
312 effect->hweffect->effect.id = -1; /* Have the kernel give it an id */ | 373 linux_effect->id = -1; /* Have the kernel give it an id */ |
313 | 374 |
314 /* Upload the effect */ | 375 /* Upload the effect */ |
315 if (ioctl(haptic->hwdata->fd, EVIOCSFF, &effect->hweffect->effect) < 0) { | 376 if (ioctl(haptic->hwdata->fd, EVIOCSFF, linux_effect) < 0) { |
316 SDL_SetError("Error uploading effect to the haptic device."); | 377 SDL_SetError("Error uploading effect to the haptic device: %s", |
378 strerror(errno)); | |
317 return -1; | 379 return -1; |
318 } | 380 } |
319 | 381 |
320 return 0; | 382 return 0; |
321 } | 383 } |