Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JOYSTICK_TYPE_MULTI_AXIS detected as mouse at the same time #257

Open
hbarrocas opened this issue Nov 30, 2022 · 0 comments
Open

JOYSTICK_TYPE_MULTI_AXIS detected as mouse at the same time #257

hbarrocas opened this issue Nov 30, 2022 · 0 comments

Comments

@hbarrocas
Copy link

Description of Issue

While attempting to use an Arduino Micro with the JoystickLibrary on JOYSTICK_TYPE_MULTI_AXIS mode, the computer immediately locks its mouse pointer to the Arduino's signal. Joystick still operates as a joystick in parallel with the mouse actions.

I've tried the other modes (JOYSTICK_TYPE_(...)) and they don't hijack the mouse pointer.

I plan to use multiple axis to read a flight sim chair (flight controls, throttle, breaks, mixture and prop pitch control) so, not sure if the other modes are capable, apart from having a dead zone, undesirable for my purpose.

Technical Details

  • Arduino Board: Arduino Micro
  • Host OS: Linux (debian 11.5)
  • Arduino IDE Version: 1.8.13

Sketch File that Reproduces Issue

#include "Joystick.h"

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_MULTI_AXIS, 32, 0,
  true, true, false, false, false, false,
  true, true, true, true, false);

/* Switch connections to Arduino */
const int sw_col[] = {2, 3, 4, 5, 6};
const int sw_row[] = {7, 11, 12, 13};
/* Analog controls' connections to Arduino */
const int analog[] = {A0, A8, A9, A1, A2, A3, A4, A5};
/* Switch readings: 1 array value per row */
int switches[4];
int ax_reading[8];
int ax_cal_lo[8] = {0, 408, 409, 400, 0, 0, 0, 0};
int ax_cal_hi[8] = {1023, 495, 485, 500, 1023, 1023, 1023, 1023};

void read_switches() {
  // sw_col pins are set up as INPUT_PULLUPs at setup() time.
  for (int row = 0; row < 4; row++) {
    pinMode(sw_row[row], OUTPUT);
    digitalWrite(sw_row[row], LOW);
    for (int col = 0; col < 5; col++) {
      int state = digitalRead(sw_col[col]);
      bitWrite(switches[row], col, !state);
      if (state) Joystick.releaseButton(5*row+col);
      else Joystick.pressButton(5*row+col);
    }
    pinMode(sw_row[row], INPUT_PULLUP);
  }
}


void calibrate() {
  // DISREGARD - NOT YET USED
  while (bitRead(switches[0], 0));
  while (!bitRead(switches[0], 0));
}

void setup() {

 
  // Configure inputs
  for (int col = 0; col < 5; col++) pinMode(sw_col[col], INPUT_PULLUP);
  for (int ax = 0; ax < 8; ax++) pinMode(analog[ax], INPUT);

  // begin in FALSE - autoSendState = OFF. state of joystick sent via Joystick.sendState() at
  // the end of the loop.
  Joystick.begin(false);
  
  // Detect if a calibration has been requested
  read_switches();
  if (bitRead(switches[0], 0) == 1) calibrate();

}

void loop() {
  for (int ax = 0; ax < 8; ax++)
    ax_reading[ax] = analogRead(analog[ax]);
    
  read_switches();

  Joystick.setYAxis(map(ax_reading[1], ax_cal_lo[1], ax_cal_hi[1], -127, 127));
  Joystick.setXAxis(map(ax_reading[2], ax_cal_lo[2], ax_cal_hi[2], -127, 127));
  Joystick.setThrottle(map(ax_reading[3], ax_cal_lo[3], ax_cal_hi[3], 0, 255));

  Joystick.sendState();
}

Additional context

I've read somewhere that there's an xorg-joystick driver intended to read a joystick as a mouse pointer and, being similar to my issue I've double-checked, and said driver is not installed on my xorg.

Thanks for your help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant