#define PAD_BUTTON_A 0x0100
#define PAD_BUTTON_B 0x0200
#define PAD_TRIGGER_Z 0x0010
int buttonsdown; //variable de 32 bits que almacena los botones presionados
...
//Si presiona A y B activa motor del control, buttonsdown vale 0x0300
if((buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))==(PAD_BUTTON_B|PAD_BUTTON_A))
motor=1;
//Si presiona A y Z desactiva motor del control, buttonsdown vale 0x0110
if((buttonsdown&(PAD_TRIGGER_Z|PAD_BUTTON_A))==(PAD_TRIGGER_Z|PAD_BUTTON_A))
motor=0;
if(buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))
motor=1;
//Programa que lee el estado del control 1
//controla también el motor
//san.link@yahoo.com.mx
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <ogcsys.h>
#include <gccore.h>
static void *xfb = NULL;
static GXRModeObj *rmode = NULL;
//Inicialización del video
void video_inicia()
{
VIDEO_Init();
PAD_Init();
switch(VIDEO_GetCurrentTvMode()) {
case VI_NTSC:
rmode = &TVNtsc480IntDf;
break;
case VI_PAL:
rmode = &TVPal528IntDf;
break;
case VI_MPAL:
rmode = &TVMpal480IntDf;
break;
default:
rmode = &TVNtsc480IntDf;
break;
}
xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
VIDEO_Configure(rmode);
VIDEO_SetNextFramebuffer(xfb);
VIDEO_SetBlack(FALSE);
VIDEO_Flush();
VIDEO_WaitVSync();
if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
}
//Subfunción que imprime 4 espacios
void espacios()
{
printf(" ");
}
//Subfunción que imprime un caracter y 3 espacios
void caracter()
{
printf("%c ",233);
}
/////////////////////////////////////////////////////////////////////////////////////////
//Función principal
int main()
{
//Declaro mis variables
int buttonsdown; //almacena qué botones se apretaron en el control 1
s8 stickx,sticky,c_x,c_y; //stick normal y stick c
u8 trigr,trigl; //nivel de presión de botones l y r
bool motor=0; //activa o desactiva el motor
//Inicia video
video_inicia();
//Comienza mi programa
while(1)
{
VIDEO_WaitVSync();
printf("\n--------------------------\n");
printf("Sanlink\n");
printf("Estado del control 1\n");
printf("A + B - Activar motor\n");
printf("A + Z - Desactivar motor\n");
PAD_ScanPads();
//lee los recién presionados y los anteriores
buttonsdown = PAD_ButtonsDown(0)|PAD_ButtonsHeld(0);
c_x=PAD_SubStickX(0);
c_y=PAD_SubStickY(0);
stickx=PAD_StickX(0);
sticky=PAD_StickY(0);
trigl=PAD_TriggerL(0);
trigr=PAD_TriggerR(0);
printf("\nBotones presionados:\n");
printf("A B X Y Z ST L R UP DW LF RT\n");
if(buttonsdown&PAD_BUTTON_A) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_B) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_X) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_Y) caracter(); else espacios();
if(buttonsdown&PAD_TRIGGER_Z) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_START) caracter(); else espacios();
if(buttonsdown&PAD_TRIGGER_L) caracter(); else espacios();
if(buttonsdown&PAD_TRIGGER_R) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_UP) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_DOWN) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_LEFT) caracter(); else espacios();
if(buttonsdown&PAD_BUTTON_RIGHT) caracter(); else espacios();
printf("\n");
printf("Stick - X:%d Y:%d\n",stickx,sticky);
printf("Stick C - X:%d Y:%d\n",c_x,c_y);
printf("Bot R - %u\n",trigr);
printf("Bot L - %u\n",trigl);
printf("Motor - %d\n",motor);
printf("Buttonsdown: %04x\n",buttonsdown);
//Si presiona A y B activa motor del control
if((buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))==(PAD_BUTTON_B|PAD_BUTTON_A))
motor=1;
//Si presiona A y Z desactiva motor del control
if((buttonsdown&(PAD_TRIGGER_Z|PAD_BUTTON_A))==(PAD_TRIGGER_Z|PAD_BUTTON_A))
motor=0;
if(motor)
PAD_ControlMotor(PAD_CHAN0,PAD_MOTOR_RUMBLE);
else
PAD_ControlMotor(PAD_CHAN0,PAD_MOTOR_STOP);
sleep(1); //espera 1 segundo para actualizar información
}
return(0);
}
#define PAD_BUTTON_A 0x0100UL
#define PAD_BUTTON_B 0x0200UL
#define PAD_TRIGGER_Z 0x0010UL
Esto fuerza al compilador a usar una constante de 32 bits, que opera directamente con el operando de 32 bits, en este caso ( buttonsdown ), creo, no lo puedo asegurar, es que en tu codigo se esta produciendo lo que se llama "integral promotion" ...Hola Richi
Probé agregando los define y el resultado fue el mismo, el problema está en la revisión del if.
Por cierto, el compilador que uso no es CCS, es un compilador gcc que funciona con un kit llamado devkitPro para compilar programas para el procesador PowerPC.
Pero ya no estoy preocupado por ahora, ya dejé en el pasado este bug. :mrgreen:
Sí es cierto, Richi en otro tema me comentó que poniéndole Volatile se elimina la optimización. Lo voy a probar y te comento los resultados Mauricio. 8)
//Si presiona A y B activa motor del control
if(buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))
motor=1;
//Si presiona A y Z desactiva motor del control
if(buttonsdown&(PAD_TRIGGER_Z|PAD_BUTTON_A))
motor=0;
//Si presiona A y B activa motor del control
if((buttonsdown&(PAD_BUTTON_B|PAD_BUTTON_A))==(PAD_BUTTON_B|PAD_BUTTON_A))
motor=1;
//Si presiona A y Z desactiva motor del control
if((buttonsdown&(PAD_TRIGGER_Z|PAD_BUTTON_A))==(PAD_TRIGGER_Z|PAD_BUTTON_A))
motor=0;