mirror of https://github.com/stella-emu/stella.git
141 lines
4.5 KiB
C++
141 lines
4.5 KiB
C++
//============================================================================
|
|
//
|
|
// SSSS tt lll lll
|
|
// SS SS tt ll ll
|
|
// SS tttttt eeee ll ll aaaa
|
|
// SSSS tt ee ee ll ll aa
|
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
|
// SS SS tt ee ll ll aa aa
|
|
// SSSS ttt eeeee llll llll aaaaa
|
|
//
|
|
// Copyright (c) 1995-2018 by Bradford W. Mott, Stephen Anthony
|
|
// and the Stella Team
|
|
//
|
|
// See the file "License.txt" for information on usage and redistribution of
|
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
//============================================================================
|
|
|
|
#include "Event.hxx"
|
|
#include "Joystick.hxx"
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
Joystick::Joystick(Jack jack, const Event& event, const System& system)
|
|
: Controller(jack, event, system, Controller::Joystick),
|
|
myControlID(-1)
|
|
{
|
|
if(myJack == Left)
|
|
{
|
|
myUpEvent = Event::JoystickZeroUp;
|
|
myDownEvent = Event::JoystickZeroDown;
|
|
myLeftEvent = Event::JoystickZeroLeft;
|
|
myRightEvent = Event::JoystickZeroRight;
|
|
myFireEvent = Event::JoystickZeroFire;
|
|
myXAxisValue = Event::SALeftAxis0Value;
|
|
myYAxisValue = Event::SALeftAxis1Value;
|
|
}
|
|
else
|
|
{
|
|
myUpEvent = Event::JoystickOneUp;
|
|
myDownEvent = Event::JoystickOneDown;
|
|
myLeftEvent = Event::JoystickOneLeft;
|
|
myRightEvent = Event::JoystickOneRight;
|
|
myFireEvent = Event::JoystickOneFire;
|
|
myXAxisValue = Event::SARightAxis0Value;
|
|
myYAxisValue = Event::SARightAxis1Value;
|
|
}
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void Joystick::update()
|
|
{
|
|
// Digital events (from keyboard or joystick hats & buttons)
|
|
myDigitalPinState[One] = (myEvent.get(myUpEvent) == 0);
|
|
myDigitalPinState[Two] = (myEvent.get(myDownEvent) == 0);
|
|
myDigitalPinState[Three] = (myEvent.get(myLeftEvent) == 0);
|
|
myDigitalPinState[Four] = (myEvent.get(myRightEvent) == 0);
|
|
myDigitalPinState[Six] = (myEvent.get(myFireEvent) == 0);
|
|
|
|
// Axis events (usually generated by the Stelladaptor)
|
|
int xaxis = myEvent.get(myXAxisValue);
|
|
int yaxis = myEvent.get(myYAxisValue);
|
|
if(xaxis > 16384-4096)
|
|
{
|
|
myDigitalPinState[Four] = false;
|
|
// Stelladaptor sends "half moved right" for L+R pushed together
|
|
if(xaxis < 16384+4096)
|
|
myDigitalPinState[Three] = false;
|
|
}
|
|
else if(xaxis < -16384)
|
|
myDigitalPinState[Three] = false;
|
|
if(yaxis > 16384-4096)
|
|
{
|
|
myDigitalPinState[Two] = false;
|
|
// Stelladaptor sends "half moved down" for U+D pushed together
|
|
if(yaxis < 16384+4096)
|
|
myDigitalPinState[One] = false;
|
|
}
|
|
else if(yaxis < -16384)
|
|
myDigitalPinState[One] = false;
|
|
|
|
// Mouse motion and button events
|
|
if(myControlID > -1)
|
|
{
|
|
// The following code was taken from z26
|
|
#define MJ_Threshold 2
|
|
int mousex = myEvent.get(Event::MouseAxisXValue),
|
|
mousey = myEvent.get(Event::MouseAxisYValue);
|
|
if(mousex || mousey)
|
|
{
|
|
if((!(abs(mousey) > abs(mousex) << 1)) && (abs(mousex) >= MJ_Threshold))
|
|
{
|
|
if(mousex < 0)
|
|
myDigitalPinState[Three] = false;
|
|
else if (mousex > 0)
|
|
myDigitalPinState[Four] = false;
|
|
}
|
|
|
|
if((!(abs(mousex) > abs(mousey) << 1)) && (abs(mousey) >= MJ_Threshold))
|
|
{
|
|
if(mousey < 0)
|
|
myDigitalPinState[One] = false;
|
|
else if(mousey > 0)
|
|
myDigitalPinState[Two] = false;
|
|
}
|
|
}
|
|
// Get mouse button state
|
|
if(myEvent.get(Event::MouseButtonLeftValue) ||
|
|
myEvent.get(Event::MouseButtonRightValue))
|
|
myDigitalPinState[Six] = false;
|
|
}
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
bool Joystick::setMouseControl(
|
|
Controller::Type xtype, int xid, Controller::Type ytype, int yid)
|
|
{
|
|
// Currently, the joystick takes full control of the mouse, using both
|
|
// axes for its two degrees of movement, and both mouse buttons for the
|
|
// single joystick button
|
|
if(xtype == Controller::Joystick && ytype == Controller::Joystick && xid == yid)
|
|
{
|
|
myControlID = ((myJack == Left && xid == 0) ||
|
|
(myJack == Right && xid == 1)
|
|
) ? xid : -1;
|
|
}
|
|
else
|
|
myControlID = -1;
|
|
|
|
return true;
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
void Joystick::setDeadZone(int deadzone)
|
|
{
|
|
deadzone = BSPF::clamp(deadzone, 0, 29);
|
|
|
|
_DEAD_ZONE = 3200 + deadzone * 1000;
|
|
}
|
|
|
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
int Joystick::_DEAD_ZONE = 3200;
|