Search
lxdream.org :: lxdream/src/maple/controller.c
lxdream 0.9.1
released Jun 29
Download Now
filename src/maple/controller.c
changeset 429:e581b90c3fb3
prev411:5ae249d63c44
next450:207461e79f21
author nkeynes
date Thu Oct 11 11:08:36 2007 +0000 (16 years ago)
permissions -rw-r--r--
last change Fix tex coords and render with linear filtering
file annotate diff log raw
nkeynes@31
     1
/**
nkeynes@429
     2
 * $Id: controller.c,v 1.6 2007-10-08 11:49:35 nkeynes Exp $
nkeynes@31
     3
 *
nkeynes@31
     4
 * Implements the standard dreamcast controller
nkeynes@31
     5
 *
nkeynes@31
     6
 * Copyright (c) 2005 Nathan Keynes.
nkeynes@31
     7
 *
nkeynes@31
     8
 * This program is free software; you can redistribute it and/or modify
nkeynes@31
     9
 * it under the terms of the GNU General Public License as published by
nkeynes@31
    10
 * the Free Software Foundation; either version 2 of the License, or
nkeynes@31
    11
 * (at your option) any later version.
nkeynes@31
    12
 *
nkeynes@31
    13
 * This program is distributed in the hope that it will be useful,
nkeynes@31
    14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nkeynes@31
    15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
nkeynes@31
    16
 * GNU General Public License for more details.
nkeynes@31
    17
 */
nkeynes@31
    18
nkeynes@2
    19
#include <stdlib.h>
nkeynes@2
    20
#include "dream.h"
nkeynes@144
    21
#include "dreamcast.h"
nkeynes@429
    22
#include "display.h"
nkeynes@2
    23
#include "maple.h"
nkeynes@2
    24
#include "maple/controller.h"
nkeynes@2
    25
nkeynes@144
    26
#define CONTROLLER_CONFIG_ENTRIES 16
nkeynes@144
    27
nkeynes@2
    28
void controller_attach( maple_device_t dev );
nkeynes@2
    29
void controller_detach( maple_device_t dev );
nkeynes@144
    30
void controller_destroy( maple_device_t dev );
nkeynes@144
    31
maple_device_t controller_new();
nkeynes@144
    32
dreamcast_config_entry_t controller_get_config( maple_device_t dev );
nkeynes@429
    33
int controller_get_cond( maple_device_t dev, int function, unsigned char *outbuf,
nkeynes@2
    34
                         int *outlen );
nkeynes@2
    35
nkeynes@2
    36
typedef struct controller_device {
nkeynes@2
    37
    struct maple_device dev;
nkeynes@2
    38
    uint32_t condition[2];
nkeynes@144
    39
    struct dreamcast_config_entry config[CONTROLLER_CONFIG_ENTRIES];
nkeynes@2
    40
} *controller_device_t;
nkeynes@2
    41
nkeynes@144
    42
struct maple_device_class controller_class = { "Sega Controller", controller_new };
nkeynes@2
    43
nkeynes@144
    44
static struct controller_device base_controller = {
nkeynes@144
    45
    { MAPLE_DEVICE_TAG, &controller_class, CONTROLLER_IDENT, CONTROLLER_VERSION, 
nkeynes@144
    46
      controller_get_config, controller_attach, controller_detach, controller_destroy,
nkeynes@144
    47
      NULL, NULL, controller_get_cond, NULL, NULL, NULL },
nkeynes@148
    48
    {0x0000FFFF, 0x80808080}, 
nkeynes@144
    49
    {{ "dpad left", CONFIG_TYPE_KEY },
nkeynes@144
    50
     { "dpad right", CONFIG_TYPE_KEY },
nkeynes@144
    51
     { "dpad up", CONFIG_TYPE_KEY },
nkeynes@144
    52
     { "dpad down", CONFIG_TYPE_KEY },
nkeynes@144
    53
     { "analog left", CONFIG_TYPE_KEY },
nkeynes@144
    54
     { "analog right", CONFIG_TYPE_KEY },
nkeynes@144
    55
     { "analog up", CONFIG_TYPE_KEY },
nkeynes@144
    56
     { "analog down", CONFIG_TYPE_KEY },
nkeynes@144
    57
     { "button X", CONFIG_TYPE_KEY },
nkeynes@144
    58
     { "button Y", CONFIG_TYPE_KEY },
nkeynes@144
    59
     { "button A", CONFIG_TYPE_KEY },
nkeynes@144
    60
     { "button B", CONFIG_TYPE_KEY },
nkeynes@144
    61
     { "trigger left", CONFIG_TYPE_KEY },
nkeynes@144
    62
     { "trigger right", CONFIG_TYPE_KEY },
nkeynes@144
    63
     { "start", CONFIG_TYPE_KEY },
nkeynes@144
    64
     { NULL, CONFIG_TYPE_NONE }} };
nkeynes@144
    65
nkeynes@144
    66
#define CONTROLLER(x) ((controller_device_t)(x))
nkeynes@2
    67
nkeynes@2
    68
maple_device_t controller_new( )
nkeynes@2
    69
{
nkeynes@2
    70
    controller_device_t dev = malloc( sizeof(struct controller_device) );
nkeynes@2
    71
    memcpy( dev, &base_controller, sizeof(base_controller) );
nkeynes@2
    72
    return MAPLE_DEVICE(dev);
nkeynes@2
    73
}
nkeynes@2
    74
nkeynes@144
    75
/**
nkeynes@144
    76
 * Input callback 
nkeynes@144
    77
 */
nkeynes@144
    78
void controller_key_callback( void *mdev, uint32_t value, gboolean isKeyDown )
nkeynes@144
    79
{
nkeynes@144
    80
    controller_device_t dev = (controller_device_t)mdev;
nkeynes@144
    81
    if( isKeyDown ) {
nkeynes@148
    82
	switch( value ) {
nkeynes@148
    83
	case JOY_LEFT:
nkeynes@148
    84
	    dev->condition[1] &= ~JOY_X_AXIS;
nkeynes@148
    85
	    break;
nkeynes@148
    86
	case JOY_RIGHT:
nkeynes@148
    87
	    dev->condition[1] |= JOY_X_AXIS;
nkeynes@148
    88
	    break;
nkeynes@148
    89
	case JOY_UP:
nkeynes@148
    90
	    dev->condition[1] &= ~JOY_Y_AXIS;
nkeynes@148
    91
	    break;
nkeynes@148
    92
	case JOY_DOWN:
nkeynes@148
    93
	    dev->condition[1] |= JOY_Y_AXIS;
nkeynes@148
    94
	    break;
nkeynes@411
    95
	case BUTTON_LEFT_TRIGGER:
nkeynes@411
    96
	case BUTTON_RIGHT_TRIGGER:
nkeynes@411
    97
	    dev->condition[0] |= value;
nkeynes@411
    98
	    break;
nkeynes@148
    99
	default:
nkeynes@148
   100
	    dev->condition[0] &= ~value;
nkeynes@148
   101
	}
nkeynes@144
   102
    } else {
nkeynes@148
   103
	switch(value ) {
nkeynes@148
   104
	case JOY_LEFT:
nkeynes@148
   105
	case JOY_RIGHT:
nkeynes@148
   106
	    dev->condition[1] = (dev->condition[1] & ~JOY_X_AXIS)| JOY_X_AXIS_CENTER;
nkeynes@148
   107
	    break;
nkeynes@148
   108
	case JOY_UP:
nkeynes@148
   109
	case JOY_DOWN:
nkeynes@148
   110
	    dev->condition[1] = (dev->condition[1] & ~JOY_Y_AXIS)| JOY_Y_AXIS_CENTER;
nkeynes@148
   111
	    break;
nkeynes@411
   112
	case BUTTON_LEFT_TRIGGER:
nkeynes@411
   113
	case BUTTON_RIGHT_TRIGGER:
nkeynes@411
   114
	    dev->condition[0] &= ~value;
nkeynes@411
   115
	    break;
nkeynes@148
   116
	default:
nkeynes@148
   117
	    dev->condition[0] |= value;
nkeynes@148
   118
	}
nkeynes@144
   119
    }
nkeynes@144
   120
}
nkeynes@2
   121
nkeynes@144
   122
dreamcast_config_entry_t controller_get_config( maple_device_t mdev )
nkeynes@2
   123
{
nkeynes@144
   124
    controller_device_t dev = (controller_device_t)mdev;
nkeynes@144
   125
    return dev->config;
nkeynes@144
   126
}
nkeynes@2
   127
nkeynes@144
   128
void controller_destroy( maple_device_t mdev )
nkeynes@144
   129
{
nkeynes@144
   130
    free( mdev );
nkeynes@144
   131
}
nkeynes@144
   132
nkeynes@144
   133
/**
nkeynes@144
   134
 * Device is being attached to the bus. Go through the config and reserve the
nkeynes@144
   135
 * keys we need.
nkeynes@144
   136
 */
nkeynes@144
   137
void controller_attach( maple_device_t mdev )
nkeynes@144
   138
{
nkeynes@144
   139
    controller_device_t dev = (controller_device_t)mdev;
nkeynes@144
   140
    input_register_key( dev->config[0].value, controller_key_callback, dev, BUTTON_DPAD_LEFT );
nkeynes@144
   141
    input_register_key( dev->config[1].value, controller_key_callback, dev, BUTTON_DPAD_RIGHT );
nkeynes@144
   142
    input_register_key( dev->config[2].value, controller_key_callback, dev, BUTTON_DPAD_UP );
nkeynes@144
   143
    input_register_key( dev->config[3].value, controller_key_callback, dev, BUTTON_DPAD_DOWN );
nkeynes@148
   144
    input_register_key( dev->config[4].value, controller_key_callback, dev, JOY_LEFT );
nkeynes@148
   145
    input_register_key( dev->config[5].value, controller_key_callback, dev, JOY_RIGHT );
nkeynes@148
   146
    input_register_key( dev->config[6].value, controller_key_callback, dev, JOY_UP );
nkeynes@148
   147
    input_register_key( dev->config[7].value, controller_key_callback, dev, JOY_DOWN );
nkeynes@144
   148
    input_register_key( dev->config[8].value, controller_key_callback, dev, BUTTON_X );
nkeynes@144
   149
    input_register_key( dev->config[9].value, controller_key_callback, dev, BUTTON_Y );
nkeynes@144
   150
    input_register_key( dev->config[10].value, controller_key_callback, dev, BUTTON_A );
nkeynes@144
   151
    input_register_key( dev->config[11].value, controller_key_callback, dev, BUTTON_B );
nkeynes@144
   152
    input_register_key( dev->config[12].value, controller_key_callback, dev, BUTTON_LEFT_TRIGGER );
nkeynes@144
   153
    input_register_key( dev->config[13].value, controller_key_callback, dev, BUTTON_RIGHT_TRIGGER );
nkeynes@144
   154
    input_register_key( dev->config[14].value, controller_key_callback, dev, BUTTON_START );
nkeynes@2
   155
}
nkeynes@2
   156
nkeynes@2
   157
void controller_detach( maple_device_t dev )
nkeynes@2
   158
{
nkeynes@2
   159
nkeynes@2
   160
}
nkeynes@2
   161
nkeynes@2
   162
nkeynes@429
   163
int controller_get_cond( maple_device_t mdev, int function, unsigned char *outbuf,
nkeynes@2
   164
                         int *outlen )
nkeynes@2
   165
{
nkeynes@2
   166
    controller_device_t dev = (controller_device_t)mdev;
nkeynes@2
   167
    if( function == MAPLE_FUNC_CONTROLLER ) {
nkeynes@2
   168
        *outlen = 2;
nkeynes@2
   169
        memcpy( outbuf, dev->condition, 8 );
nkeynes@2
   170
        return 0;
nkeynes@2
   171
    } else {
nkeynes@2
   172
        return MAPLE_ERR_FUNC_UNSUP;
nkeynes@2
   173
    }
nkeynes@2
   174
}
nkeynes@2
   175
.