lsnes/generic/controller.cpp
2011-09-18 12:42:33 +03:00

90 lines
1.9 KiB
C++

#include "controller.hpp"
#include "lsnes.hpp"
#include <snes/snes.hpp>
#include <ui-libsnes/libsnes.hpp>
namespace
{
porttype_t porttypes[2];
int analog_indices[3] = {-1, -1, -1};
bool analog_is_mouse[3];
void update_analog_indices() throw()
{
int i = 0;
for(unsigned j = 0; j < sizeof(analog_indices) / sizeof(analog_indices[0]); j++)
analog_indices[j] = -1;
for(unsigned j = 0; j < 8; j++) {
devicetype_t d = controller_type_by_logical(j);
switch(d) {
case DT_NONE:
case DT_GAMEPAD:
break;
case DT_MOUSE:
analog_is_mouse[i] = true;
analog_indices[i++] = j;
break;
case DT_SUPERSCOPE:
case DT_JUSTIFIER:
analog_is_mouse[i] = false;
analog_indices[i++] = j;
break;
}
}
}
}
int controller_index_by_logical(unsigned lid) throw()
{
bool p1multitap = (porttypes[0] == PT_MULTITAP);
unsigned p1devs = port_types[porttypes[0]].devices;
unsigned p2devs = port_types[porttypes[1]].devices;
if(lid >= p1devs + p2devs)
return -1;
if(!p1multitap)
if(lid < p1devs)
return lid;
else
return 4 + lid - p1devs;
else
if(lid == 0)
return 0;
else if(lid < 5)
return lid + 3;
else
return lid - 4;
}
int controller_index_by_analog(unsigned aid) throw()
{
if(aid > 2)
return -1;
return analog_indices[aid];
}
bool controller_ismouse_by_analog(unsigned aid) throw()
{
if(aid > 2)
return false;
return analog_is_mouse[aid];
}
devicetype_t controller_type_by_logical(unsigned lid) throw()
{
int x = controller_index_by_logical(lid);
if(x < 0)
return DT_NONE;
enum porttype_t rawtype = porttypes[x >> 2];
if((x & 3) < port_types[rawtype].devices)
return port_types[rawtype].dtype;
else
return DT_NONE;
}
void controller_set_port_type(unsigned port, porttype_t ptype, bool set_core) throw()
{
if(set_core && ptype != PT_INVALID)
snes_set_controller_port_device(port != 0, port_types[ptype].bsnes_type);
porttypes[port] = ptype;
update_analog_indices();
}