Go Down

Topic: error: expected initializer before 'void' (Read 4 times) previous topic - next topic

Ian W.

Apr 26, 2010, 04:10 am Last Edit: Apr 26, 2010, 01:54 pm by Raveious Reason: 1
im having some trouble, im getting this error. "error: expected initializer before 'void'" and if i move stuff around it changes where the error occurs, never the same line, currently its #define lazor 14. please help.
Code: [Select]

#include <Wire.h>
#include <string.h>
#include <utility\twi.h>
#undef int
#include <stdio.h>
#include <Servo.h>


// adapt to your hardware config
#define POWER_VIA_PORT_C2_C3 1    // use port pins port C2 and C3 as power supply of the Nunchuck (direct plug using wiichuck adapter)

#define USE_NEW_WAY_INIT 1        // use "The New Way" of initialization <http://wiibrew.org/wiki/Wiimote#The_New_Way>
#define WII_IDENT_LEN ((byte)6)
#define WII_TELEGRAM_LEN ((byte)6)
#define WII_NUNCHUCK_TWI_ADR ((byte)0x52)

#define HIGH true
#define LOW false

#define ledPin 12
#define debugled 13
#define button 11
#define lazor 14
#define drive_motor 9
#define steer_servo 10
#define X_servo 7
#define Y_servo 8

uint8_t outbuf[WII_TELEGRAM_LEN];            // array to store arduino output

long previousMillis = 0;
long previousWIIupdate = 0;
long previousDEBUG = 0;

int cnt = 0;
int x = 0, y = 0;
int joy_x_axis = 0;
int joy_y_axis = 0;
int accel_x_axis = 0;
int accel_y_axis = 0;
int accel_z_axis = 0;
int z_button = 0;
int c_button = 0;

bool no_com = false;
bool debug = false;
bool locked = false;
bool accel_state = false;

Servo x_servo;
Servo y_servo;
Servo steer;
Servo drive

void setup ()
{
 pinMode(button, INPUT);
 pinMode(debugled,OUTPUT);
 pinMode(lazor,OUTPUT);
 pinMode(ledPin, OUTPUT);

 delay(100);

 if (digitalRead(button) == HIGH)
 {
   // turn green LED on:    
   digitalWrite(debugled, HIGH);  

   debug = true;

   Serial.begin (57600);
 }

#ifdef POWER_VIA_PORT_C2_C3    // power supply of the Nunchuck via port C2 and C3
 PORTC &=~ _BV(PORTC2);
 PORTC |=  _BV(PORTC3);
 DDRC |= _BV(PORTC2) | _BV(PORTC3);  // make outputs
 delay(100);  // wait for things to stabilize
#endif

 Wire.begin(); // initialize i2c
 // we need to switch the TWI speed, because the nunchuck uses Fast-TWI
 // normally set in hardware\libraries\Wire\utility\twi.c twi_init()
 // this is the way of doing it without modifying the original files
#define TWI_FREQ_NUNCHUCK 400000L
 TWBR = ((CPU_FREQ / TWI_FREQ_NUNCHUCK) - 16) / 2;

 nunchuck_init(0); // send the initialization handshake

 // display the identification bytes, must be "00 00 A4 20 00 00" for the Nunchuck
 byte i;
 if(readControllerIdent(outbuf) == 0)
 {
   if (debug)
     Serial.print("Ident=");
   for (i = 0; i < WII_TELEGRAM_LEN; i++)
   {
     if (debug)
     {
       Serial.print(outbuf[i], HEX);
       Serial.print(' ');
     }
   }
   if (debug)
     Serial.println();
 }

 steer.attach(steer_servo);
 drive.attach(drive_motor);
 x_servo.attach(X_servo);
 y_servo.attach(Y_servo);

 if (debug)
   Serial.println("Finished setup");
}

// params:
//   timeout: abort when timeout (in ms) expires, 0 for unlimited timeout
//   return:  0 == ok, 1 == timeout
byte nunchuck_init (unsigned short timeout)
{
 byte rc = 1;

#ifndef USE_NEW_WAY_INIT
 // look at <http://wiibrew.org/wiki/Wiimote#The_Old_Way> at "The Old Way"
 Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);      // transmit to device 0x52
 Wire.send (0x40);            // sends memory address
 Wire.send (0x00);            // sends sent a zero.  
 Wire.endTransmission ();      // stop transmitting
#else
 // disable encryption
 // look at <http://wiibrew.org/wiki/Wiimote#The_New_Way> at "The New Way"

 unsigned long time = millis();
 do
 {
   Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);      // transmit to device 0x52
   Wire.send (0xF0);            // sends memory address
   Wire.send (0x55);            // sends data.  
   if(Wire.endTransmission() == 0) // stop transmitting
   {
     Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);      // transmit to device 0x52
     Wire.send (0xFB);            // sends memory address
     Wire.send (0x00);            // sends sent a zero.  
     if(Wire.endTransmission () == 0)      // stop transmitting
     {
       rc = 0;
     }
   }
 }
 while (rc != 0 && (!timeout || ((millis() - time) < timeout)));
#endif

 return rc;
}


// params:
//   ident [out]: pointer to buffer where 6 bytes of identification is stored. Buffer must be at least 6 bytes long.
//                A list of possible identifications can be found here: <http://wiibrew.org/wiki/Wiimote#The_New_Way>
//   return:  0 == ok, 1 == error
byte readControllerIdent(byte* pIdent)
{
 byte rc = 1;

 // read identification
 Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);      // transmit to device 0x52
 Wire.send (0xFA);            // sends memory address of ident in controller
 if(Wire.endTransmission () == 0)      // stop transmitting
 {
   byte i;
   Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);      // request data from nunchuck
   for (i = 0; (i < WII_TELEGRAM_LEN) && Wire.available (); i++)
   {
     pIdent[i] = Wire.receive();      // receive byte as an integer
   }
   if(i == WII_TELEGRAM_LEN)
   {
     rc = 0;
   }
 }
 return rc;
}

void clearTwiInputBuffer(void)
{
 // clear the receive buffer from any partial data
 while( Wire.available ())
   Wire.receive ();
}


void send_zero ()
{
 // I don't know why, but it only works correct when doing this exactly 3 times
 // otherwise only each 3rd call reads data from the controller (cnt will be 0 the other times)
 for(byte i = 0; i < 3; i++)
 {
   Wire.beginTransmission (WII_NUNCHUCK_TWI_ADR);      // transmit to device 0x52
   Wire.send (0x00);            // sends one byte
   Wire.endTransmission ();      // stop transmitting
   delay(1);
 }
}

void loop ()
{
 if (digitalRead(button) && ((millis() - previousMillis) > 1000))
 {
   accel_state = !accel_state;
   previousMillis = millis();
 }
 if (no_com)
 {
   if ((millis() - previousDEBUG) > 500)
   {
     previousDEBUG = millis();

     debug = !debug;
     digitalWrite (debugled, debug);
   }
 }

 //if ((millis() - previousWIIupdate) > 90)
 //{previousWIIupdate = millis();
 delay (90);
 send_zero (); // send the request for next bytes
 Wire.requestFrom (WII_NUNCHUCK_TWI_ADR, WII_TELEGRAM_LEN);      // request data from nunchuck

 for (cnt = 0; (cnt < WII_TELEGRAM_LEN) && Wire.available (); cnt++)
 {
   outbuf[cnt] = nunchuk_decode_byte (Wire.receive ());      // receive byte as an integer
 }



 clearTwiInputBuffer();

 // If we recieved the 6 bytes, then go print them
 if (cnt >= WII_TELEGRAM_LEN)
 {
   print ();
 }
 //}

 /*if ((outbuf[5] >> 0) & 1)
  digitalWrite(lazor,LOW);
  else
  {
  digitalWrite(lazor,HIGH);
 
  if ((outbuf[5] >> 1) & 1){
  }
 
  else if (no_com)
  locked = true;
  else
  locked = !locked;
  }*/
 /*if (accel_state)
  {
  if (accel_y_axis < 475)
  {
  LF_motor.run(BACKWARD);
  RT_motor.run(BACKWARD);
 
  LF_motor.setSpeed(map(accel_y_axis,475,313,85,255));
  RT_motor.setSpeed(map(accel_y_axis,475,313,85,255));
  }
  else if (accel_y_axis > 525)
  {
  LF_motor.run(FORWARD);
  RT_motor.run(FORWARD);
 
  LF_motor.setSpeed(map(accel_y_axis,525,720,85,255));
  RT_motor.setSpeed(map(accel_y_axis,525,720,85,255));
  }
  else
  {
  LF_motor.setSpeed(0);
  RT_motor.setSpeed(0);
  }
  }
  else
  {*/
 //if (c_button)
 //{
 digitalWrite (ledPin, !c_button);

 drive.write(map(joy_y_axis,6,247,0,180);

 //analogWrite(drive_motor,joy_y_axis);

 steer.write(map(joy_x_axis,8,247,15,115));
 //}
 /*else
  {
  x_servo.write(map(joy_x_axis,0,255,0,180));
  y_servo.write(map(joy_y_axis,0,255,30,180));
 
  analogWrite (drive_motor, 127);
 
  //Light is good if on
  digitalWrite (ledPin, HIGH);
  }*/
 //}
}

// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits.  That is why I
// multiply them by 2 * 2
void print ()
{
 joy_x_axis = outbuf[0];
 joy_y_axis = outbuf[1];
 accel_x_axis = outbuf[2] * 2 * 2;
 accel_y_axis = outbuf[3] * 2 * 2;
 accel_z_axis = outbuf[4] * 2 * 2;

 z_button = 0;
 c_button = 0;

 if (joy_y_axis == 127)
   joy_y_axis += 1;


 // byte outbuf[5] contains bits for z and c buttons
 // it also contains the least significant bits for the accelerometer data
 // so we have to check each bit of byte outbuf[5]
 if ((outbuf[5] >> 0) & 1)
 {
   z_button = 1;
 }
 if ((outbuf[5] >> 1) & 1)
 {
   c_button = 1;
 }

 if ((outbuf[5] >> 2) & 1)
 {
   accel_x_axis += 2;
 }
 if ((outbuf[5] >> 3) & 1)
 {
   accel_x_axis += 1;
 }

 if ((outbuf[5] >> 4) & 1)
 {
   accel_y_axis += 2;
 }
 if ((outbuf[5] >> 5) & 1)
 {
   accel_y_axis += 1;
 }

 if ((outbuf[5] >> 6) & 1)
 {
   accel_z_axis += 2;
 }
 if ((outbuf[5] >> 7) & 1)
 {
   accel_z_axis += 1;
 }

 if (debug)
 {
   Serial.print (joy_x_axis, DEC);
   Serial.print ("\t");

   Serial.print (joy_y_axis, DEC);
   Serial.print ("\t");

   Serial.print (accel_x_axis, DEC);
   Serial.print ("\t");

   Serial.print (accel_y_axis, DEC);
   Serial.print ("\t");

   Serial.print (accel_z_axis, DEC);
   Serial.print ("\t");

   Serial.print (z_button, DEC);
   Serial.print ("\t");

   Serial.print (c_button, DEC);
   Serial.print ("\t");

   Serial.print ("\r\n");
 }

 if (((joy_x_axis == 128) && (joy_y_axis == 128) && (accel_x_axis == 509) && (accel_y_axis == 511) && (accel_z_axis == 661) && (z_button == 1) && (c_button == 1)) || ((joy_x_axis == 255) && (joy_y_axis == 255) && (accel_x_axis >= 1023) && (accel_y_axis >= 1023) && (accel_z_axis >= 1023) && (z_button == 1) && (c_button == 1)))
   no_com = true;
 else
   no_com  = false;
}

Ian W.

#1
Apr 26, 2010, 04:15 am Last Edit: Apr 26, 2010, 04:16 am by Raveious Reason: 1
(add this to the end, its to long to fit in the first post)

using 0018

Code: [Select]
// Decode data format that original Nunchuck uses with old init sequence. This never worked with
// other controllers (e.g. wireless Nunchuck from other vendors)
char nunchuk_decode_byte (char x)
{
#ifndef USE_NEW_WAY_INIT
 x = (x ^ 0x17) + 0x17;
#endif
 return x;
}

wayoda

Hi,

there is no need to include this header:
Code: [Select]
#include <utility\twi.h>
its meant for internal use only by the Wire-lib

What is that good for?
Code: [Select]
#undef int

Eberhard



RoyK

Code: [Select]
Servo x_servo;
Servo y_servo;
Servo steer;
Servo drive //<----- put a semicolon after Servo drive

void setup ()
{
 pinMode(button, INPUT);
 pinMode(debugled,OUTPUT);
 pinMode(lazor,OUTPUT);
 pinMode(ledPin, OUTPUT);

Ian W.

lol, i cant believe i missed that XD
thanks

RoyK

That "expected initializer before" something almost always is caused by a missing semicolon usually immediately above the 'something'.


Ian W.


Go Up