expected unqualified-id before '.' token

Grateful for help on this one bug in the sketch, for a USB button box & rotary encoder games controller.
The error is : expected unqualified-id before ‘.’ token, it relates to the Joystick.setButton line

The lines are:
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_.ccwchar, 1); delay(50); Joystick.setButton(rotaries*.ccwchar,0);_
_
};_
if (result == DIR_CW) {Joystick.setButton(rotaries_.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
};
}
}*_

:o

CTRL T is your/our friend.

Post your complete sketch and complete error message but only after you look at Read this before posting a programming question so you know how to do it

Post the code.
Use code tags
Post the error message.
All of it.

#include <Joystick.h>

#include <Key.h>
#include <Keypad.h>

/*
These libraries will be used to emulate a joystick, and assigning keys to the button output

*/

/*
We enable the onboard resistors that pull the current down to the board
as you can see in the schema
*/
#define ENABLE_PULLUPS
#define NUMROTARIES 5
#define NUMBUTTONS 16
#define NUMROWS 4
#define NUMCOLS 4

/*
This variable will map our 2D matrix, and assign a number for each button
The values are just incrementing numbers
*/
byte buttons[NUMROWS][NUMCOLS] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11},
{12,13,14,15}
};

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

/*
Here we map each of the rotary encoders into an array
You will notice that 1 and 0 are reversed, that’s because on this arduino board, tx and rx are reversed
{
pin1 (clk),
pin2 (dta),
button to press when turning backwards,
button to press when turning forwards
current state of button (0)
}
*/
rotariesdef rotaries[NUMROTARIES] {
{1,0,16,17,0},
{2,3,18,19,0},
{4,5,20,21,0},
{6,7,22,23,0},
{8,9,24,25,0}
};

/*
This is some next level shit, don’t look at it for too long
And don’t worry about it, it works.
*/
#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

/*
This one is important, here we defined the number of the ports we are using for the rows and cols
If you look at my schema, you will see that the rows (in red) and cols (in blue) match with the numbers below
*/
byte rowPins[NUMROWS] = {15,14,16,10};
byte colPins[NUMCOLS] = {21,20,19,18};

/*
The following code will loop all inputs and assign them to buttons that our fake joystick can output
The code below uses the above inputs, so you don’t have to make any changes here.
*/
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*.stateChanged ) *

  • {*
    _ switch (buttbx.key*.kstate) { _
    _
    case PRESSED:_
    _
    case HOLD:_
    _ Joystick.setButton(buttbx.key.kchar, 1);
    break;
    case RELEASED:
    case IDLE:
    Joystick.setButton(buttbx.key.kchar, 0);
    break;
    }
    }
    }
    }
    }
    void rotary_init() {
    for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries.pin1, INPUT);
    pinMode(rotaries.pin2, INPUT);_

    #ifdef ENABLE_PULLUPS*

    _ digitalWrite(rotaries*.pin1, HIGH);
    digitalWrite(rotaries.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_.ccwchar, 1); delay(50); Joystick.setButton(rotaries.ccwchar, 0);
    };_

    if (result == DIR_CW) {
    Joystick.setButton(rotaries_.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
    };
    }
    }*_

another_arduino_buttonbox:188:70: error: expected unqualified-id before ‘.’ token
Joystick.setButton(rotaries_.ccwchar, 1); delay(50); Joystick.setButton(rotaries*.ccwchar, 0);_
_
^_
another_arduino_buttonbox:191:15: error: expected unqualified-id before ‘.’ token
Joystick.setButton(rotaries_.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
^
another_arduino_buttonbox:191:69: error: expected unqualified-id before ‘.’ token
Joystick.setButton(rotaries.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
^*_

Post code and errors in accordance with the forum guidelines (see posts 1, 2 and 3).

yep my apologies I tried to go back in and edit the post but it would not let me.

#include <Joystick.h>

#include <Key.h>
#include <Keypad.h>



/*
    These libraries will be used to emulate a joystick, and assigning keys to the button output
    https://www.arduinolibraries.info/libraries/keypad
    https://github.com/MHeironimus/ArduinoJoystickLibrary
*/


/*
    We enable the onboard resistors that pull the current down to the board
    as you can see in the schema
*/
#define ENABLE_PULLUPS
#define NUMROTARIES 5
#define NUMBUTTONS 16
#define NUMROWS 4
#define NUMCOLS 4

/*
    This variable will map our 2D matrix, and assign a number for each button
    The values are just incrementing numbers
*/
byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3},
  {4,5,6,7},
  {8,9,10,11},
  {12,13,14,15}
};

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

/*
    Here we map each of the rotary encoders into an array
    You will notice that 1 and 0 are reversed, that's because on this arduino board, tx and rx are reversed
    {
        pin1 (clk),
        pin2 (dta),
        button to press when turning backwards,
        button to press when turning forwards
        current state of button (0)
    }
*/
rotariesdef rotaries[NUMROTARIES] {
  {1,0,16,17,0},
  {2,3,18,19,0},
  {4,5,20,21,0},
  {6,7,22,23,0},
  {8,9,24,25,0}
};

/*
    This is some next level shit, don't look at it for too long
    And don't worry about it, it works.
*/
#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

/*
    This one is important, here we defined the number of the ports we are using for the rows and cols
    If you look at my schema, you will see that the rows (in red) and cols (in blue) match with the numbers below
*/
byte rowPins[NUMROWS] = {15,14,16,10};
byte colPins[NUMCOLS] = {21,20,19,18};

/*
    The following code will loop all inputs and assign them to buttons that our fake joystick can output
    The code below uses the above inputs, so you don't have to make any changes here.
*/
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.stateChanged )   
            {
            switch (buttbx.key.kstate) { 
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key.kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key.kchar, 0);
                              break;
            }
           }   
         }
     }
}

void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries.pin1, INPUT);
    pinMode(rotaries.pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries.pin1, HIGH);
      digitalWrite(rotaries.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.ccwchar, 1); delay(50); Joystick.setButton(rotaries.ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
    };
  }
}

Error message again:

error: expected unqualified-id before ‘.’ token
Joystick.setButton(rotaries.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
^

I got this program to run on a teensy but not on the pro micro. As you will surmise, I am very new to this and hope someone with more experience will help me get this working - thanks.

Is that all of the error message?

It looks like you need to create an instance of Joystick before you use it

What do the examples for the Joystick library do ?

Hi,
As suggested by @UKHeliBOB look at the examples for the Joystick library.

#include "Joystick.h"


// Create Joystick
Joystick_ Joystick;

Tom... :slight_smile:

This is the entire error msg I get if I add Joystick_ Joystick:

"error: expected unqualified-id before ‘.’ token
Joystick.setButton(rotaries_.cwchar, 1); delay(50); Joystick.setButton(rotaries*.cwchar, 0);_
_
^_
Multiple libraries were found for “Joystick.h”
Used: C:\Users\alhee\OneDrive\Documents\Arduino\libraries\Joystick
Not used: C:\Users\alhee\OneDrive\Documents\Arduino\libraries\AxisJoystick
Not used: C:\Program Files (x86)\Arduino\libraries\ArduinoJoystickLibrary-master
‘Joystick_’ does not name a type; did you mean ‘Joystick’? "*

When I got the code working for the Teensy I just deleted the line Joystick_ Joystick.
I’m also getting a lot of problems with the Pro Micro not being recognised by Windows, tried following loads of threads about drivers but nothing seems to work.

The normal way to create an instance of an object such as the joystick would be

Joystick theJoystick;

where Joystick is the name of the library and theJoystick (or whatever name you choose, except Joystick) is the name of the object that you then use throughout the program as in

theJoystick.begin();

maybe its an issue with my libraries then?

sprool:
maybe its an issue with my libraries then?

It told you:

Multiple libraries were found for "Joystick.h"

Please post you latest version and full error message

so how do i know there should only be one joystick library and which is the correct one to keep?

You should examine the documentation for each library to determine which library is most appropriate for the Arduino that you are using and what you want to do.

Use only the example code for the library that the code was written for. You cannot just grab any old joystick code off the net and expect it to work with any old library that you find.

All part of the learning curve, I guess. I whittled it down to a single joystick library mentioned in the button box build project I'mmost closely following, its not like 'grabbing any old code and any old library'! but when there are 2 or 3 thread running about building joystick button boards and they all mention a joystick library I had to assume they are same in my current state of ignorance. Although the code compiles fine now, the pro micro is refusing to reset or accept code. I think I'll save myself a load of hassle and go back to building this project with another teensy2 board.

sprool:
Although the code compiles fine now, the pro micro is refusing to reset or accept code.

What do you mean, what error do you get?
You do have ProMini slected as the board and the correct COM port selected?
Thanks.. Tom.... :slight_smile: