test/testrumble.c
author Andreas Schiffler <aschiffler@ferzkopp.net>
Wed, 26 Dec 2012 22:26:44 -0800
changeset 6773 5ebc5a9e35b4
parent 6771 55337ff4256f
child 7437 964e8876ad3b
permissions -rw-r--r--
Add surface test suite; minor improvements to render suite; refactor image saving into test lib compare function; fix for Haiku build
slouken@5535
     1
/*
slouken@5535
     2
  Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
slouken@5535
     3
slouken@5535
     4
  This software is provided 'as-is', without any express or implied
slouken@5535
     5
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     6
  arising from the use of this software.
slouken@5535
     7
slouken@5535
     8
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
     9
  including commercial applications, and to alter it and redistribute it
slouken@5535
    10
  freely.
slouken@5535
    11
*/
slouken@5360
    12
/*
slouken@5360
    13
Copyright (c) 2011, Edgar Simo Serra
slouken@5360
    14
All rights reserved.
slouken@5360
    15
slouken@5360
    16
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
slouken@5360
    17
slouken@5360
    18
    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
slouken@5360
    19
    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
slouken@5360
    20
    * Neither the name of the Simple Directmedia Layer (SDL) nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
slouken@5360
    21
slouken@5360
    22
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
slouken@5360
    23
*/
slouken@5360
    24
slouken@5360
    25
/*
slouken@5360
    26
 * includes
slouken@5360
    27
 */
slouken@5360
    28
#include <stdlib.h>
slouken@5360
    29
#include <stdio.h>              /* printf */
slouken@5360
    30
#include <string.h>             /* strstr */
slouken@5360
    31
#include <ctype.h>              /* isdigit */
slouken@5360
    32
aschiffler@6771
    33
#include "SDL.h"
aschiffler@6771
    34
aschiffler@6771
    35
#ifndef SDL_HAPTIC_DISABLED
aschiffler@6771
    36
aschiffler@6771
    37
#include "SDL_haptic.h"
slouken@5360
    38
slouken@5360
    39
static SDL_Haptic *haptic;
slouken@5360
    40
slouken@5360
    41
slouken@5360
    42
/**
slouken@5360
    43
 * @brief The entry point of this force feedback demo.
slouken@5360
    44
 * @param[in] argc Number of arguments.
slouken@5360
    45
 * @param[in] argv Array of argc arguments.
slouken@5360
    46
 */
slouken@5360
    47
int
slouken@5360
    48
main(int argc, char **argv)
slouken@5360
    49
{
slouken@5360
    50
    int i;
slouken@5360
    51
    char *name;
slouken@5360
    52
    int index;
slouken@5360
    53
    SDL_HapticEffect efx[5];
slouken@5360
    54
    int id[5];
slouken@5360
    55
    int nefx;
slouken@5360
    56
    unsigned int supported;
slouken@5360
    57
slouken@5360
    58
    name = NULL;
slouken@5360
    59
    index = -1;
slouken@5360
    60
    if (argc > 1) {
slouken@5360
    61
        name = argv[1];
slouken@5360
    62
        if ((strcmp(name, "--help") == 0) || (strcmp(name, "-h") == 0)) {
slouken@5360
    63
            printf("USAGE: %s [device]\n"
slouken@5360
    64
                   "If device is a two-digit number it'll use it as an index, otherwise\n"
slouken@5360
    65
                   "it'll use it as if it were part of the device's name.\n",
slouken@5360
    66
                   argv[0]);
slouken@5360
    67
            return 0;
slouken@5360
    68
        }
slouken@5360
    69
slouken@5360
    70
        i = strlen(name);
slouken@5360
    71
        if ((i < 3) && isdigit(name[0]) && ((i == 1) || isdigit(name[1]))) {
slouken@5360
    72
            index = atoi(name);
slouken@5360
    73
            name = NULL;
slouken@5360
    74
        }
slouken@5360
    75
    }
slouken@5360
    76
slouken@5360
    77
    /* Initialize the force feedbackness */
slouken@5360
    78
    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK |
slouken@5360
    79
             SDL_INIT_HAPTIC);
slouken@5360
    80
    printf("%d Haptic devices detected.\n", SDL_NumHaptics());
slouken@5360
    81
    if (SDL_NumHaptics() > 0) {
slouken@5360
    82
        /* We'll just use index or the first force feedback device found */
slouken@5360
    83
        if (name == NULL) {
slouken@5360
    84
            i = (index != -1) ? index : 0;
slouken@5360
    85
        }
slouken@5360
    86
        /* Try to find matching device */
slouken@5360
    87
        else {
slouken@5360
    88
            for (i = 0; i < SDL_NumHaptics(); i++) {
slouken@5360
    89
                if (strstr(SDL_HapticName(i), name) != NULL)
slouken@5360
    90
                    break;
slouken@5360
    91
            }
slouken@5360
    92
slouken@5360
    93
            if (i >= SDL_NumHaptics()) {
slouken@5360
    94
                printf("Unable to find device matching '%s', aborting.\n",
slouken@5360
    95
                       name);
slouken@5360
    96
                return 1;
slouken@5360
    97
            }
slouken@5360
    98
        }
slouken@5360
    99
slouken@5360
   100
        haptic = SDL_HapticOpen(i);
slouken@5360
   101
        if (haptic == NULL) {
slouken@5360
   102
            printf("Unable to create the haptic device: %s\n",
slouken@5360
   103
                   SDL_GetError());
slouken@5360
   104
            return 1;
slouken@5360
   105
        }
slouken@5360
   106
        printf("Device: %s\n", SDL_HapticName(i));
slouken@5360
   107
    } else {
slouken@5360
   108
        printf("No Haptic devices found!\n");
slouken@5360
   109
        return 1;
slouken@5360
   110
    }
slouken@5360
   111
slouken@5360
   112
    /* We only want force feedback errors. */
slouken@5360
   113
    SDL_ClearError();
slouken@5360
   114
slouken@5360
   115
    if (SDL_HapticRumbleSupported(haptic) == SDL_FALSE) {
slouken@5360
   116
        printf("\nRumble not supported!\n");
slouken@5360
   117
        return 1;
slouken@5360
   118
    }
slouken@5360
   119
    if (SDL_HapticRumbleInit(haptic) != 0) {
slouken@5360
   120
        printf("\nFailed to initialize rumble: %s\n", SDL_GetError());
slouken@5360
   121
        return 1;
slouken@5360
   122
    }
slouken@5360
   123
    printf("Playing 2 second rumble at 0.5 magnitude.\n");
slouken@5360
   124
    if (SDL_HapticRumblePlay(haptic, 0.5, 5000) != 0) {
slouken@5360
   125
       printf("\nFailed to play rumble: %s\n", SDL_GetError() );
slouken@5360
   126
       return 1;
slouken@5360
   127
    }
slouken@5360
   128
    SDL_Delay(2000);
slouken@5360
   129
    printf("Stopping rumble.\n");
slouken@5360
   130
    SDL_HapticRumbleStop(haptic);
slouken@5360
   131
    SDL_Delay(2000);
slouken@5360
   132
    printf("Playing 2 second rumble at 0.3 magnitude.\n");
slouken@5360
   133
    if (SDL_HapticRumblePlay(haptic, 0.3, 5000) != 0) {
slouken@5360
   134
       printf("\nFailed to play rumble: %s\n", SDL_GetError() );
slouken@5360
   135
       return 1;
slouken@5360
   136
    }
slouken@5360
   137
    SDL_Delay(2000);
slouken@5360
   138
slouken@5360
   139
    /* Quit */
slouken@5360
   140
    if (haptic != NULL)
slouken@5360
   141
        SDL_HapticClose(haptic);
slouken@5360
   142
    SDL_Quit();
slouken@5360
   143
slouken@5360
   144
    return 0;
slouken@5360
   145
}
slouken@5360
   146
aschiffler@6771
   147
#else
aschiffler@6771
   148
aschiffler@6771
   149
int
aschiffler@6771
   150
main(int argc, char *argv[])
aschiffler@6771
   151
{
aschiffler@6771
   152
    fprintf(stderr, "SDL compiled without Haptic support.\n");
aschiffler@6771
   153
    exit(1);
aschiffler@6771
   154
}
aschiffler@6771
   155
aschiffler@6771
   156
#endif