question about using array to call function with for loop

I am new to programming and Arduino! so please excuse me in advance!
I have a program that uses PS2 mice as sensors. Everything works well, however I would like to compress the code a bit. I have searched the web using lots of different keywords, however I cannot find what I am after, and I am sure it is very simple, and would most probably use an array.

With the code, first I declare the PS2 mice:

  PS2 mouse1(3,2);                                                      //  Pin 2 is mouse 1 data pin, pin 3 is the clock pin.  
  PS2 mouse2(5,4);                                                      //  Pin 4 is mouse 2 data pin, pin 5 is the clock pin.  
  PS2 mouse3(7,6);                                                      //  Pin 6 is mouse 3 data pin, pin 7 is the clock pin. 
  PS2 mouse4(9,8);                                                      //  Pin 8 is mouse 4 data pin, pin 9 is the clock pin.

How might I access these with a for loop? such as:

  for (int n = 0; n < 4; n++) {
  mouse[n].write(0xff);                                                                            // reset
  mouse[n].read();                                                                                 // ack byte
  mouse[n].read();                                                                                 // blank */
  mouse[n].read();                                                                                 // blank */
  mouse[n].write(0xf0);                                                                            // remote mode
  mouse[n].read();                                                                                 // ack
  }

The relevant code I am using is below if you need to understand better what I am doing.

Thanks in advance.

  • Also how do you define the line below (so I can go online and research the nuts and bolts of its structure)
    PS2 mouse1(3,2);
//   I have some variables to store the x and y axis values retrieved from the mice:

  char m1x, m1y, m2x, m2y, m3x, m3, m4x, m4y;           //  mice x and y axis movement ('m1x' and 'm1y' is mouse 1  'x' and 'y' axis  ... etc)

//   The code is basically untouched from the PS2 mouse library example:

//   This function is to setup the mice:

void mice_init()                                                                                //  initialize the mice. Reset them, and place them into remote mode, so we can get the encoder data on demand.  
{
  /* first mouse one */
  mouse1.write(0xff);                                                                            // reset
  mouse1.read();                                                                                 // ack byte
  mouse1.read();                                                                                 // blank */
  mouse1.read();                                                                                 // blank */
  mouse1.write(0xf0);                                                                            // remote mode
  mouse1.read();                                                                                 // ack
  /* now mouse two */
  mouse2.write(0xff);                                                                           // reset
  mouse2.read();                                                                                // ack byte
  mouse2.read();                                                                                // blank 
  mouse2.read();                                                                                // blank 
  mouse2.write(0xf0);                                                                           // remote mode
  mouse2.read();                                                                                // ack

.....  etc etc
} 


//  And to get the data:

void get_mice_data()   //**** get a reading from mice ****
{
          char mstat;   //  mstat is the status of the mouse buttons *** Not using this function in this code, but need to read it out ***  
          
          mouse1.write(0xeb);                                                                       // give me data!
          mouse1.read();                                                                            // ignore ack
          mstat = mouse1.read();m1x = mouse1.read(); m1y = mouse1.read();                     
  
          mouse2.write(0xeb);                                                                       // give me data!
          mouse2.read();                                                                            // ignore ack
          mstat = mouse2.read(); m2x = mouse2.read(); m2y = mouse2.read();

          mouse3.write(0xeb);                                                                       // give me data!
          mouse3.read();                                                                            // ignore ack
          mstat = mouse3.read(); m3x = mouse3.read(); m3y = mouse3.read();

          mouse4.write(0xeb);                                                                       // give me data!
          mouse4.read();                                                                            // ignore ack
          mstat = mouse4.read(); m4x = mouse4.read(); m4y = mouse4.read();
}

Construct an array of PS2 objects

PS2 mouse[4] = {PS2(3,2), PS2(5,4), PS2(7,6),PS2(9,8)};

Then use your code:

for (int n = 0; n < 4; n++) {
  mouse[n].write(0xff);                                                                            // reset
  mouse[n].read();                                                                                 // ack byte
  mouse[n].read();                                                                                 // blank */
  mouse[n].read();                                                                                 // blank */
  mouse[n].write(0xf0);                                                                            // remote mode
  mouse[n].read();                                                                                 // ack
}

EDIT: Tom's solution is better, but I didn't see it in my search -- I only got this

make all of the mice into an array:

PS2 mouse[4];

If you then get an error like this:

error: no matching function for call to ...

Then you'll have to take a different approach (the new C++ standard, C++11, gives a way around this, but the IDE includes an old version of the compiler). You can do this:

PS2 mouse0(3, 2);
PS2 mouse1(4, 5);
PS2 mouse2(6, 7);
PS2 mouse3(8, 9);

PS2* mice[4] = {&mouse0, &mouse1, &mouse2, &mouse3};

But then mice will be an array of pointers, so you'll have to change anything like

mouse1.function();

to

mice[1]->function();
  • Also how do you define the line below (so I can go online and research the nuts and bolts of its structure) PS2 mouse1(3,2); [/quote that's a constructor.

Brilliant! Thanks Tom for the quick reply. Complied and it works. Now grabbing data.

WizenedEE, Thanks as well. Will try your method now. And cheers for the clarification.

Chris