Este artigo discute sobre como desenvolver hardware de game pad simples e fazer interface com a placa Raspberrypi e também sobre o técnica de interface de um código de jogo escrito em HTML5 com o game pad. Aqui um Jogo Snake escrito em HTML5 e JavaScript foi modificado de forma que possa ser jogado com o novo game pad com quatro botões. Neste projeto são utilizadas as técnicas de sinais, pipe, fork etc.
((wysiwyg_imageupload:11011:))
O jogo é executado em uma janela do navegador e se comunica com o game pad por meio de um Named Pipe ou FIFO. Existem vários processos em execução que podem ler o game pad e gravar os comandos necessários no FIFO para controlar o jogo. O JavaScript escrito no código do jogo simplesmente lê o FIFO para os dados de controle de entrada.
Fig. 2: Diagrama de blocos do gamepad Raspberry Pi
Código-fonte do projeto
###
#include <bcm2835.h> #include <pthread.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
#define IN_PIN1 RPI_GPIO_P1_07
#define IN_PIN2 RPI_GPIO_P1_22
#define IN_PIN3 RPI_GPIO_P1_18
#define IN_PIN4 RPI_GPIO_P1_16#define OUT_PIN1 RPI_GPIO_P1_15
#define OUT_PIN2 RPI_V2_GPIO_P1_13
#define OUT_PIN3 RPI_GPIO_P1_12
#define OUT_PIN4 RPI_GPIO_P1_11#define SNAKE_FIFO_NAME "xyz"
vazio set_pins_input (void);
vazio set_pins_output (void);
vazio set_output_pins_low (void);
void button_signal_handler ( int sig, siginfo_t *siginfo, void *context );
vazio signal_on_state_change_pin1 ( vazio );
vazio signal_on_state_change_pin2 ( vazio );
vazio signal_on_state_change_pin3 (void);
vazio signal_on_state_change_pin4 (void);
void sig_set_handler (int sinal, void *handler);
void sig_send_val (pid_t id, int signo, int val);pid_t filho_id(5);
ponto interno = 0;int principal (void)
{
int eu;
int cobra_fifo = -1;se (!bcm2835_init )
retornar 1;set_pins_output ;
set_output_pins_low ;
set_pins_input ;
atraso (100);sig_set_handler ( SIGUSR1, &button_signal_handler );
if (! (child_id (0) = garfo ))
{
signal_on_state_change_pin1 ;
_sair(0);
}
outro;if (! (child_id (1) = garfo ))
{
signal_on_state_change_pin2 ;
_sair(0);
}
outro;if (! (child_id (2) = garfo ))
{
signal_on_state_change_pin3 ;
_sair(0);
}
outro;if (! (child_id (3) = garfo ))
{
signal_on_state_change_pin4 ;
_sair(0);
}
outro;enquanto (1)
{
sistema("eco x >> xyz");
atraso (100);
}bcm2835_close ;
retornar 0;
}vazio signal_on_state_change_pin1 ( vazio )
{
enquanto (1)
{
se (bcm2835_gpio_lev(IN_PIN1))
{
atraso (50);
se (bcm2835_gpio_lev(IN_PIN1))
{
sig_send_val (getppid , SIGUSR1, 1);fazer
{
enquanto ( bcm2835_gpio_lev (IN_PIN1))
atraso (1);
atraso (50);
}
enquanto (bcm2835_gpio_lev(IN_PIN1));sig_send_val (getppid , SIGUSR1, 1);
}
outro;
}outro;
atraso (1);
}
}vazio signal_on_state_change_pin2 ( vazio )
{
enquanto (1)
{
se (bcm2835_gpio_lev(IN_PIN2))
{
atraso (50);
se (bcm2835_gpio_lev(IN_PIN2))
{
sig_send_val (getppid , SIGUSR1, 2);fazer
{
enquanto ( bcm2835_gpio_lev (IN_PIN2))
atraso (1);
atraso (50);
}
enquanto (bcm2835_gpio_lev(IN_PIN2));sig_send_val (getppid , SIGUSR1, 2);
}
outro;
}outro;
atraso (1);
}
}vazio signal_on_state_change_pin3 ( vazio )
{
enquanto (1)
{
se (bcm2835_gpio_lev(IN_PIN3))
{
atraso (50);
se (bcm2835_gpio_lev(IN_PIN3))
{
sig_send_val (getppid , SIGUSR1, 3);fazer
{
enquanto ( bcm2835_gpio_lev (IN_PIN3))
atraso (1);
atraso (50);
}
enquanto (bcm2835_gpio_lev(IN_PIN3));sig_send_val (getppid , SIGUSR1, 3);
}
outro;
}outro;
atraso (1);
}
}vazio signal_on_state_change_pin4 ( vazio )
{
enquanto (1)
{
se (bcm2835_gpio_lev(IN_PIN4))
{
atraso (50);
se (bcm2835_gpio_lev(IN_PIN4))
{
sig_send_val (getppid , SIGUSR1, 4);fazer
{
enquanto ( bcm2835_gpio_lev (IN_PIN4))
atraso (1);
atraso (50);
}
enquanto (bcm2835_gpio_lev(IN_PIN4));sig_send_val (getppid , SIGUSR1, 4);
}
outro;
}outro;
atraso (1);
}
}void button_signal_handler (int sig, siginfo_t *siginfo, void *contexto)
{
if ( 1 == *( ( int * ) &siginfo -> si_value ) )
sistema("echo você >> xyz");
senão if ( 2 == *( ( int * ) &siginfo -> si_value ) )
sistema("echo r >> xyz");
senão if (3 == *( (int *) &siginfo -> si_value))
sistema("echo l >> xyz");
senão if ( 4 == *( ( int * ) &siginfo -> si_value ) )
sistema("echo d >> xyz");
outro;bcm2835_gpio_write (OUT_PIN1,st);
st = ~ st;
}vazio set_output_pins_low ( vazio )
{
bcm2835_gpio_write (OUT_PIN1, BAIXO);
bcm2835_gpio_write (OUT_PIN2, BAIXO);
bcm2835_gpio_write (OUT_PIN3, BAIXO);
bcm2835_gpio_write (OUT_PIN4, BAIXO);
}vazio set_pins_output ( vazio )
{
bcm2835_gpio_fsel (OUT_PIN1, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel (OUT_PIN2, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel (OUT_PIN3, BCM2835_GPIO_FSEL_OUTP);
bcm2835_gpio_fsel (OUT_PIN4, BCM2835_GPIO_FSEL_OUTP);
}vazio set_pins_input ( vazio )
{
bcm2835_gpio_fsel ( IN_PIN1, BCM2835_GPIO_FSEL_INPT );
bcm2835_gpio_set_pud ( IN_PIN1, BCM2835_GPIO_PUD_OFF );bcm2835_gpio_fsel ( IN_PIN2, BCM2835_GPIO_FSEL_INPT );
bcm2835_gpio_set_pud ( IN_PIN2, BCM2835_GPIO_PUD_OFF );bcm2835_gpio_fsel ( IN_PIN3, BCM2835_GPIO_FSEL_INPT );
bcm2835_gpio_fsel ( IN_PIN3, BCM2835_GPIO_FSEL_INPT );bcm2835_gpio_set_pud ( IN_PIN4, BCM2835_GPIO_PUD_OFF );
bcm2835_gpio_set_pud ( IN_PIN4, BCM2835_GPIO_PUD_OFF );
}void sig_send_msg ( pid_t id, int signo, char *msg )
{
sinal de união *sigdata;sigdata=malloc(sizeof(união sigval));
sigdata -> sival_ptr = mensagem;sigqueue (id, sinal, *sigdata);
grátis (sigdata);
}void sig_send_val ( pid_t id, int signo, int val )
{
sinal de união *sigdata;sigdata=malloc(sizeof(união sigval));
sigdata -> sival_int = val;sigqueue (id, sinal, *sigdata);
grátis (sigdata);
}void sig_set_handler ( int sinal, void *handler )
{
struct sigaction *act;
act=malloc(sizeof(struct sigaction));
agir -> sa_sigaction = manipulador;
agir -> sa_flags = SA_SIGINFO;sigaction (signo, ato, NULL);
}
###
Diagramas de circuito
Diagrama de circuito para jogar o jogo Snake-Raspberry-Pi |