Error compiling with Joystick.h library

marc_ams

New member
hello there,

since this morning I'm looking for the compiling error with the Joystick.h library(ArduinoJoystickLibrary-master). I'am using a teensy 4.0


Code:
//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 24
#define NUMROWS 5
#define NUMCOLS 5


byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23},
};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
  {0,1,24,25,0},
  {2,3,26,27,0},
  {4,5,28,29,0},
  {6,7,30,31,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21,20,19,18,15}; 
byte colPins[NUMCOLS] = {14,16,10,9,8}; 

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); 

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_JOYSTICK, 32, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  Joystick.begin();
  rotary_init();}

void loop() { 

  CheckAllEncoders();

  CheckAllButtons();

}

void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            switch (buttbx.key[i].kstate) {  
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     }
}


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
   unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}

Arduino: 1.8.19 (Windows 10), TD: 1.57, Board: "Teensy 4.0, Serial + Keyboard + Mouse + Joystick, 600 MHz, Faster, US English"

In file included from C:\Users\zobie\OneDrive\Documents\Arduino\libraries\ArduinoJoystickLibrary-master\src/Joystick.h:24:0,

from C:\Users\zobie\OneDrive\Bureau\wim_s_button_box_code\32-FUNCTION-BUTTON-BOX-master\32-FUNCTION-BUTTON-BOX-master\ARDUINO_BUTTON_BOXV2\ARDUINO_BUTTON_BOXV2.ino:8:

C:\Users\zobie\OneDrive\Documents\Arduino\libraries\ArduinoJoystickLibrary-master\src/DynamicHID/DynamicHID.h:37:28: fatal error: PluggableUSB.h: No such file or directory

compilation terminated.

Error compiling for board Teensy 4.0.

error.jpg

teensy setup.png

library files.jpg

with these pictures you can see the arduino version, the librarys, USB type.

If anyone knows how I can fix the error tell me ;-)


Best regards.
 

Attachments

  • ARDUINO_BUTTON_BOXV2.ino
    3.9 KB · Views: 20
  • teensy.txt
    820 bytes · Views: 23
Last edited:
Not sure why you are trying to include a different library?

If you build with a USB type that contains joystick.
It will include the core file: On my machine, right now, that would be either:
C:\arduino-1.8.19\hardware\teensy\avr\cores\teensy4\usb_joystick.h
C:\Users\kurte\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.0-beta2\cores\teensy4\usb_joystick.h

Depending on if I am using Arduino 1 or Arduino 2 builds.

Suggest don't include that library file.
 
I need this library because I made a PCB around the teensy , the ArduinoJoystickLibrary-master and this code.
It's too late to change the code I already buy the PCB
 
First question is what library is this?
Is it the one https://github.com/MHeironimus/ArduinoJoystickLibrary mentioned in https://awesomeopensource.com/project/MHeironimus/ArduinoJoystickLibrary ?

Looking at their Readme you see:
Code:
This library can be used with Arduino IDE 1.6.6 or above (see Wiki - Testing Details for more information) to add one or more joysticks 
(or gamepads) to the list of HID devices an Arduino Leonardo or Arduino Micro (or any Arduino clone that is based on the ATmega32u4) can support. 

This library will also work with the Arduino Due, thanks to @Palakis. A complete list of supported boards can be found in the Wiki - Supported Boards. 

This will not work with Arduino IDE 1.6.5 (or below) [COLOR="#FF0000"]or with non-32u4 based Arduino devices[/COLOR] (e.g. Arduino UNO, Arduino MEGA, etc.).

This library is not compatible with the underlying Teensy USB code.

That however does not necessarily imply you cannot update the code you posted to work with a Teensy 4

If you remove that include file from your sketch you will see some other error messages like:
Code:
C:\Users\kurte\Documents\Arduino\bar\bar.ino:95:1: error: 'Joystick_' does not name a type
   95 | Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
      | ^~~~~~~~~
C:\Users\kurte\Documents\Arduino\bar\bar.ino: In function 'void CheckAllButtons()':
C:\Users\kurte\Documents\Arduino\bar\bar.ino:122:40: error: 'class usb_joystick_class' has no member named 'setButton'; did you mean 'button'?
  122 |                               Joystick.setButton(buttbx.key[i].kchar, 1);
      |                                        ^~~~~~~~~
      |                                        button
C:\Users\kurte\Documents\Arduino\bar\bar.ino:126:40: error: 'class usb_joystick_class' has no member named 'setButton'; did you mean 'button'?
  126 |                               Joystick.setButton(buttbx.key[i].kchar, 0);
      |                                        ^~~~~~~~~
      |                                        button
C:\Users\kurte\Documents\Arduino\bar\bar.ino: In function 'void CheckAllEncoders()':
C:\Users\kurte\Documents\Arduino\bar\bar.ino:157:16: error: 'class usb_joystick_class' has no member named 'setButton'; did you mean 'button'?
  157 |       Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
      |                ^~~~~~~~~
      |                button
C:\Users\kurte\Documents\Arduino\bar\bar.ino:157:71: error: 'class usb_joystick_class' has no member named 'setButton'; did you mean 'button'?
  157 |       Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
      |                                                                       ^~~~~~~~~
      |                                                                       button
C:\Users\kurte\Documents\Arduino\bar\bar.ino:160:16: error: 'class usb_joystick_class' has no member named 'setButton'; did you mean 'button'?
  160 |       Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
      |                ^~~~~~~~~
      |                button
C:\Users\kurte\Documents\Arduino\bar\bar.ino:160:70: error: 'class usb_joystick_class' has no member named 'setButton'; did you mean 'button'?
  160 |       Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
      |                                                                      ^~~~~~~~~
      |                                                                      button
Note I compiled for T4.1 in this case

And as the error messages imply, you should use button instead. More details about the Joystick code built in with the Teensy when USB type includes joystick
can be found up at: https://www.pjrc.com/teensy/td_joystick.html

Note, there is not enough information here to know if your board will work or not. For example, if your board was designed around something like a Atmega 32u4 board like the Leonardo, which runs at 5v and you try to adapt it to a Teensy 4.0, you need to be aware that the Teensy runs at 3.3v and it's IO pins are not 5v tolerant. So for example, if you have things on your board, that would cause a 5v signal to go to one or more IO pins, this could damage the teensy.

Good luck
 
Back
Top