mirror of
https://github.com/option8/RetroConnector.git
synced 2024-11-26 22:50:32 +00:00
joystick interface now works with arbitrary joystick axes
code now scans all available axes for changes, then selects the first two as X and Y, rather than relying on joysticks to have X and Y at 0 and 1.
This commit is contained in:
parent
3ca006d483
commit
f7138bd1bc
@ -2,11 +2,9 @@
|
||||
|
||||
#include <SPI.h>
|
||||
|
||||
// set pin 4 as the slave select for the digital pot:
|
||||
const int slaveSelectPin = A0; //4;
|
||||
//const float foo = .21;
|
||||
// set pin A0 as the slave select for the digital pot:
|
||||
const int slaveSelectPin = A0;
|
||||
const int TrimPin = A3;
|
||||
|
||||
const int Butt0Pin = A4;
|
||||
const int Butt1Pin = A5;
|
||||
|
||||
@ -41,17 +39,12 @@ void setup()
|
||||
{
|
||||
// set the slaveSelectPin as an output:
|
||||
pinMode (slaveSelectPin, OUTPUT);
|
||||
|
||||
|
||||
pinMode (Butt0Pin, OUTPUT);
|
||||
pinMode (Butt1Pin, OUTPUT);
|
||||
|
||||
|
||||
// initialize SPI:
|
||||
SPI.begin();
|
||||
|
||||
|
||||
|
||||
Serial.begin( 115200 );
|
||||
Serial.println("Start");
|
||||
|
||||
@ -63,41 +56,36 @@ void setup()
|
||||
if (!Hid.SetReportParser(0, &Joy))
|
||||
ErrorMessage<uint8_t>(PSTR("SetReportParser"), 1 );
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
Usb.Task();
|
||||
int channelX = 5;
|
||||
int channelY = 3;
|
||||
|
||||
float foo = float(analogRead(TrimPin))/1023.000;
|
||||
|
||||
float calibrate = float(analogRead(TrimPin))/1023.000;
|
||||
|
||||
// need to determine if x or x2 is giving values
|
||||
int joyX = JoyEvents.X;
|
||||
int channel = 5;
|
||||
|
||||
digitalPotWrite(channel, joyX * foo);
|
||||
digitalPotWrite(channel - 1, joyX * foo);
|
||||
|
||||
// need to determine if y or y2 is giving values
|
||||
int joyY = JoyEvents.Y;
|
||||
channel = 3;
|
||||
|
||||
digitalPotWrite(channel, joyY * foo);
|
||||
digitalPotWrite(channel - 1, joyY * foo);
|
||||
|
||||
|
||||
// write the values to the POTs
|
||||
digitalPotWrite(channelX, joyX * calibrate);
|
||||
digitalPotWrite(channelX - 1, joyX * calibrate);
|
||||
|
||||
digitalPotWrite(channelY, joyY * calibrate);
|
||||
digitalPotWrite(channelY - 1, joyY * calibrate);
|
||||
|
||||
// write the buttons
|
||||
digitalWrite(Butt0Pin,JoyEvents.Butt0);
|
||||
digitalWrite(Butt1Pin,JoyEvents.Butt1);
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void digitalPotWrite(int address, int value) {
|
||||
// take the SS pin low to select the chip:
|
||||
digitalWrite(slaveSelectPin,LOW);
|
||||
|
@ -1,12 +1,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
#include "hidjoystickrptparser.h"
|
||||
|
||||
JoystickReportParser::JoystickReportParser(JoystickEvents *evt) :
|
||||
joyEvents(evt),
|
||||
oldHat(0xDE),
|
||||
oldButtons(0)
|
||||
{
|
||||
for (uint8_t i=0; i<RPT_GEMEPAD_LEN; i++)
|
||||
@ -41,7 +36,8 @@ void JoystickReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t
|
||||
// Calling Button Event Handler for every button changed
|
||||
if (changes)
|
||||
{
|
||||
for (uint8_t i=0; i<0x0C; i++)
|
||||
// for (uint8_t i=0; i<0x0C; i++) // 12 buttons 0x0C == 12
|
||||
for (uint8_t i=0; i<0x0F; i++) // up to 16 buttons
|
||||
{
|
||||
uint16_t mask = (0x0001 << i);
|
||||
|
||||
@ -57,18 +53,71 @@ void JoystickReportParser::Parse(HID *hid, bool is_rpt_id, uint8_t len, uint8_t
|
||||
|
||||
void JoystickEvents::OnGamePadChanged(const GamePadEventData *evt)
|
||||
{
|
||||
// got to find a better way to make an array from this structured vars
|
||||
axes[0] = evt->axis0;
|
||||
axes[1] = evt->axis1;
|
||||
axes[2] = evt->axis2;
|
||||
axes[3] = evt->axis3;
|
||||
axes[4] = evt->axis4;
|
||||
|
||||
X = evt->X;
|
||||
Y = evt->Y;
|
||||
Serial.print("X: ");
|
||||
Serial.print(X);
|
||||
//PrintHex<uint8_t>(evt->X, 0x80);
|
||||
Serial.print("\tY: ");
|
||||
Serial.print(Y);
|
||||
// PrintHex<uint8_t>(evt->Y, 0x80);
|
||||
Serial.println("");
|
||||
|
||||
|
||||
if(initialized) {
|
||||
|
||||
|
||||
for(int i =0; i<5 ; i++ ){
|
||||
|
||||
if (axes[i] < axesMin[i] ) {
|
||||
axesMin[i] = axes[i];
|
||||
}
|
||||
|
||||
if (axes[i] > axesMax[i]) {
|
||||
axesMax[i] = axes[i];
|
||||
}
|
||||
|
||||
axesDelta[i] = axesMax[i] - axesMin[i];
|
||||
|
||||
}
|
||||
|
||||
|
||||
for(int j =0; j<5 ; j++ ){
|
||||
|
||||
if(axesDelta[j] > 0) {
|
||||
X = axes[j];
|
||||
Y = axes[j+1];
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
|
||||
for(int i =0; i<5 ; i++ ){
|
||||
axesMin[i] = axes[i];
|
||||
axesMax[i] = axes[i];
|
||||
}
|
||||
|
||||
initialized = true;
|
||||
// don't bother with the first set of data, as joystick initializes.
|
||||
|
||||
}
|
||||
|
||||
Serial.print(X);
|
||||
Serial.print(" ");
|
||||
Serial.println(Y);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
keep track of axes 0 - 4 (5 axes)
|
||||
|
||||
min and max values. max-min = range
|
||||
|
||||
first axis with range, and first +1 are X and Y
|
||||
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -76,11 +125,11 @@ void JoystickEvents::OnButtonUp(uint8_t but_id)
|
||||
{
|
||||
Serial.print("Up: ");
|
||||
Serial.println(but_id);
|
||||
if(but_id == 1) {
|
||||
if(but_id % 2 == 0) { // all even numbered buttons = button 0
|
||||
Butt0 = false;
|
||||
}
|
||||
|
||||
if(but_id == 2) {
|
||||
if(but_id % 2 == 1) { // all odd buttons = button 1
|
||||
Butt1 = false;
|
||||
}
|
||||
|
||||
@ -92,11 +141,11 @@ void JoystickEvents::OnButtonDn(uint8_t but_id)
|
||||
Serial.println(but_id);
|
||||
|
||||
|
||||
if(but_id == 1) {
|
||||
if(but_id % 2 == 0) { // all even numbered buttons = button 0
|
||||
Butt0 = true;
|
||||
}
|
||||
|
||||
if(but_id == 2) {
|
||||
if(but_id % 2 == 1) { // all odd buttons = button 1
|
||||
Butt1 = true;
|
||||
}
|
||||
}
|
||||
|
@ -23,7 +23,7 @@
|
||||
|
||||
struct GamePadEventData
|
||||
{
|
||||
uint8_t X, Y;
|
||||
uint8_t axis0, axis1, axis2, axis3, axis4; // read first 5 axes
|
||||
};
|
||||
|
||||
class JoystickEvents
|
||||
@ -36,6 +36,18 @@ public:
|
||||
uint8_t X;
|
||||
uint8_t Y;
|
||||
|
||||
int axes[5];
|
||||
int axesMin[5];
|
||||
int axesMax[5];
|
||||
int axesDelta[5];
|
||||
|
||||
int activeX;
|
||||
int activeY;
|
||||
//arrays of min and max values
|
||||
// var with which axis is X/Y
|
||||
|
||||
boolean initialized;
|
||||
|
||||
boolean Butt0;
|
||||
boolean Butt1;
|
||||
|
||||
@ -48,7 +60,6 @@ class JoystickReportParser : public HIDReportParser
|
||||
JoystickEvents *joyEvents;
|
||||
|
||||
uint8_t oldPad[RPT_GEMEPAD_LEN];
|
||||
uint8_t oldHat;
|
||||
uint16_t oldButtons;
|
||||
|
||||
public:
|
||||
|
Loading…
Reference in New Issue
Block a user