Hi there Im using the Bluepad32 library to connect my arduino to an Xbox controller & I´m trying to clean up my code. I´ve nested two funcitons within the "void processGamepad(ControllerPtr gamepad) " Function which in the example code Updates the states of the variables assigned to the controller. It fails to compile with this error message:
C:\Users\Bob\Documents\Arduino\ActualThing_1_0TX.ino\ActualThing_1_0TX.ino.ino: In function 'void processGamepad(ControllerPtr)':
C:\Users\Bob\Documents\Arduino\ActualThing_1_0TX.ino\ActualThing_1_0TX.ino.ino:93:27: error: expected primary-expression before 'gamepad'
CheckMode(ControllerPtr gamepad);
^~~~~~~
C:\Users\Bob\Documents\Arduino\ActualThing_1_0TX.ino\ActualThing_1_0TX.ino.ino:94:31: error: expected primary-expression before 'gamepad'
CheckThrottle(ControllerPtr gamepad);
^~~~~~~
exit status 1
Compilation error: expected primary-expression before 'gamepad'
The code Is as follows:
#include <Wire.h>
#include <Bluepad32.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
ControllerPtr myControllers[BP32_MAX_CONTROLLERS];
#define MIN_PULSE_LENGTH 100 // Minimum pulse length in µs
#define MAX_PULSE_LENGTH 200 // Maximum pulse length in µs
float locV, airV;
unsigned long Atime = 0;//AirTime
unsigned long Stime = 0;//SendTime
unsigned long Ltime = 0;//LocalTime
bool mtoggle = false;
bool calibrated = true;
bool vtoggle = false;
bool vtoggle1 = false;
int trim[2]={0,0};//[0]:aileron,[1]:elevon
int a, h, k, j, AileronI, ElevatorI, power = 0;
uint8_t data[3]={0,90,90};//[0]:throtle,[1]:aileron,[2]:elevon
void setup() {
Serial.begin(115200);
Serial1.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
Stime = millis();
locV = 0;
airV = 0;
const uint8_t* addr = BP32.localBdAddress();
BP32.setup(&onConnectedController, &onDisconnectedController);
}
void loop() {
BP32.update();
for (int i = 0; i < BP32_MAX_CONTROLLERS; i++) {
ControllerPtr myController = myControllers[i];
if (myController && myController->isConnected()) {
processGamepad(myController);
}
}
ReadVoltage();
DrawFrame();
CommsSend();
PrintData();
}
void onConnectedController(ControllerPtr ctl) {
bool foundEmptySlot = false;
for (int i = 0; i < BP32_MAX_GAMEPADS; i++) {
if (myControllers[i] == nullptr) {
// Serial.print("CALLBACK: Controller is connected, index=");
// Serial.println(i);
myControllers[i] = ctl;
foundEmptySlot = true;
ControllerProperties properties = ctl->getProperties();
break;
}
}
}
void onDisconnectedController(ControllerPtr ctl) {
bool foundGamepad = false;
for (int i = 0; i < BP32_MAX_GAMEPADS; i++) {
if (myControllers[i] == ctl) {
myControllers[i] = nullptr;
foundGamepad = true;
break;
}
}
}
void processGamepad(ControllerPtr gamepad) {
BP32.update();
CheckMode(ControllerPtr gamepad);
CheckThrottle(ControllerPtr gamepad);
}
void CheckMode(ControllerPtr gamepad){
while (calibrated == false){
display.clearDisplay();
if (gamepad->miscButtons() == 8){
data[0]=200;//[0]:throtle
display.fillRect(3, 24, 61*2, 6, SSD1306_WHITE);
}
else{
data[0]=100;
}
if (gamepad->miscButtons()-k == -2){
calibrated = !calibrated;
data[0]=100;
}
k = gamepad->miscButtons();
CommsSend();
display.drawRect(00, 00, 128, 32, SSD1306_WHITE);
display.setCursor(3, 3);
display.println("LOCAL");
display.setCursor(3, 8);
display.println("-----");
display.setCursor(3, 14);
display.print("00.00");
//display.fillRect(32, 8, 6, 1, SSD1306_WHITE);
display.fillRect(38, 11, 8, 2, SSD1306_WHITE);
display.fillRect(39, 11, 6, 10, SSD1306_WHITE);
display.fillRect(39, 3, 6, 8, SSD1306_WHITE);
display.setCursor(52, 3);
display.println("LYNX");
display.setCursor(96, 3);
display.println("CRAFT");
display.setCursor(96, 8);
display.println("-----");
display.setCursor(96, 14);
display.print("00.00");
display.fillRect(82, 11, 8, 2, SSD1306_WHITE);
display.fillRect(83, 11, 6, 10, SSD1306_WHITE);
display.fillRect(83, 3, 6, 8, SSD1306_WHITE);
//display.fillRect(90, 9, 6, 1, SSD1306_WHITE);
display.setCursor(49, 14);//(55,14 "CAL")
display.println("!CAL!");
display.display();
}
if (gamepad->miscButtons()-k == -2){
//Serial.println("CALIBRATED!!");
calibrated = !calibrated;
mtoggle = false;
k = 0;
}
k = gamepad->miscButtons();
}
void CheckThrottle(ControllerPtr gamepad){
if (gamepad->miscButtons()-j == -4){
mtoggle = !mtoggle;
data[0] = 108;
j =0 ;
}
j = gamepad->miscButtons();
if (mtoggle == true){
if (gamepad->throttle()>0){
data[0] += map(gamepad->throttle(),0,1023,0,8);
if (data[0]>200){
data[0] = 200;
}
}
if (gamepad->brake()>0){
data[0] -= map(gamepad->brake(),0,1023,0,8);
if (data[0]<108){
data[0] = 108;
}
}
}
else{
data[0] = 100;
}
if(h-gamepad->dpad()==-8){ //Aileron Trim
if(trim[0]<=6){
trim[0] += 1;
}
}
else if(h-gamepad->dpad()==-4){ //Aileron Trim
if(trim[0]>=-6){
trim[0] -= 1;
}
}
else if(h-gamepad->dpad()==-1){ //Elevon Trim
if(trim[1]<=15){
trim[1] += 1;
}
}
else if(h-gamepad->dpad()==-2){ //Elevon Trim
if(trim[1]>=0){
trim[1] -= 1;
}
}
h=gamepad->dpad();
if(abs(gamepad->axisRX())>50){
data[1]= map(gamepad->axisRX(),-512,512,78,102);
if(data[1]<78){
data[1] = 78;
}
if(data[1]>102){
data[1] = 102;
}
}
else{
data[1] = 90;
}
data[1]+=trim[0];
if(abs(gamepad->axisY())>50){
data[2]= map(gamepad->axisY(),-512,512,60,120);
if(data[2]<60){
data[2] = 60;
}
if(data[2]>120){
data[2] = 120;
}
}
else{
data[2] = 90;
}
data[2]+=trim[1];
}
void CommsSend(){
if((millis()-Stime)>=50){
Serial1.write(0x5A);
Serial1.write((char*) data, sizeof(data));
Stime = millis();
}
}
void ReadVoltage(){
if (Serial1.available()) {
uint8_t c = Serial1.read();// make sure we find the initial header
if (c != 0xA5) {
return;// loop around waiting for the next packet of data
}
airV = 2*Serial1.read()/25.1;//Divisor de voltaje es multiplicador*0.251
Atime = millis();
}
if(millis()-Atime>2000){
airV = 0.00;
Atime = millis();
}
if(millis()-Ltime>2000){
locV = map(analogRead(A3),0,1023,0,3.30/0.404);//Reads up top 3.3, maps to 8V*0.404V divider
Ltime=millis();
}
}
void DrawFrame(){
display.clearDisplay();
display.drawRect(00, 00, 128, 32, SSD1306_WHITE);
if(mtoggle == true){
power = map(data[0],104,200,2,61);
display.fillRect(64-power, 24, power*2, 6, SSD1306_WHITE);
}
display.setCursor(3, 3);
display.println("LOCAL");
display.setCursor(3, 8);
display.println("-----");
display.setCursor(3, 14);
if(locV<10){
display.print("0");
}
display.println(locV);
display.setCursor(52, 3);
display.println("LYNX");
display.setCursor(96, 3);
display.println("CRAFT");
display.setCursor(96, 8);
display.println("-----");
display.setCursor(96, 14);
if(airV<10){
display.print("0");
}
display.println(airV);
if(locV<7.6 && airV<11.4){
display.setCursor(48, 14);
display.println("!!V!!");
}
else if(locV>7.6 && airV>11.4){
display.setCursor(61, 14);
display.println("V");
}
else if(locV<7.6){
display.setCursor(49, 14);
display.println("! V");
}
else{
display.setCursor(61, 14);
display.println("V !");
}
ElevatorI=map(data[2],60,120,-9,9);
if(ElevatorI<=0){
display.fillRect(39, 12+ElevatorI, 6, abs(ElevatorI), SSD1306_WHITE);
}
else{
display.fillRect(39, 12, 6, ElevatorI, SSD1306_WHITE);
}
display.fillRect(38, 11, 8, 2, SSD1306_WHITE);
display.fillRect(82, 11, 8, 2, SSD1306_WHITE);
AileronI=map(data[1],78,102,-9,9);
if(AileronI<=0){
display.fillRect(83, 12+AileronI, 6, abs(AileronI), SSD1306_WHITE);
}
else{
display.fillRect(83, 12, 6, AileronI, SSD1306_WHITE);
}
display.display();
}
void PrintData(){
Serial.println("----");
for (int i=0; i <=2 ; i++) {
Serial.println(data[i]);
}
Serial.println(airV);
}