//----------------------------------------------------- // CONTROLE PLAYSTATION // Essa biblioteca possui funções para ler o estado do controle // de playstation // // Alterações em: // // 01/04/2007 23:30 - Preparação da versão 1.0 - somente funcionalidades básicas // 05/12/2007 02:45 - versão 1.0 - primeira versão funcional // 14/01/2009 01:10 - Adição de descrição de sinais //----------------------------------------------------- //----------------------------------------------------- // Descritivo das cores da fiação do controle PS // Clock = Azul // Data = Marrom - Atenção! Esse sinal precisa de Pull Up (1K) // Command = Laranja // Att = Amarelo // Vcc = Vermelho // Gnd = Preto // Force Feed Back = Cinza (não implementado ainda) //----------------------------------------------------- //Pinos onde o controle está conectado #define cmd PIN_B7 #define att PIN_B6 #define clk PIN_B5 #define dado PIN_B4 //Tempos em micro-segundos (us) #define tempoInicio 40 #define tempoClk 40 #define tempoEntreByte 40 #define tempoEntreCiclo 20 //ms int psxDado[6]; //Buffer do controle int psxDadoAnt[6]; //Buffer do controle int1 psxMudou; //Botões do Controle int1 btnSelect = 0; int1 btnJoyE = 0; int1 btnJoyD = 0; int1 btnStart = 0; int1 btnUp = 0; int1 btnDown = 0; int1 btnLeft = 0; int1 btnRight = 0; int1 btnL1 = 0; int1 btnL2 = 0; int1 btnR1 = 0; int1 btnR2 = 0; int1 btnTriangulo = 0; int1 btnBola = 0; int1 btnQuadrado = 0; int1 btnXis = 0; int X_Left=0; int Y_Left=0; int X_Right=0; int Y_Right=0; int centro_x_right = 0; int centro_y_right = 0; int centro_x_left = 0; int centro_y_left = 0; int psxCont; //contador genérico // ---------------------------------------------------- // psxLeByte - Captura um byte, enviado pelo controle através do pino DADO // ---------------------------------------------------- int psxLeByte() { int aux=0; int c; for(c=0;c<=7;c++) //Passa por todos os bits da variável psxByte { output_bit(clk,false); //baixa o clock, isso faz com que o controle disponibilize o dado no pino "dado" delay_us(tempoClk); //invertido para representar a realidade do controle if(INPUT(dado)==1) bit_clear(aux, c); else bit_set(aux, c); output_bit(clk,true); //Sobe o clock } delay_us(tempoEntreByte); return (aux); } // ---------------------------------------------------- // psxGravaByte - Escreve um byte, enviado pelo controle através do pino CMD // ---------------------------------------------------- void psxGravaByte(int byteDado) { int c; for(c=0;c<=7;c++) //Passa por todos os bits da variável psxByte { //Sobe ou desce o pino de acordo com cada bit da variável psByte //significa que estamos enviando o comando 0x01h para o controle if(bit_test(byteDado,c)) output_bit(cmd,true); else output_bit(cmd,false); output_bit(clk,false); //depois de setar o pino, manda clock para o controle delay_us(tempoClk); //aguarda um tempinho... output_bit(clk,true); //sobe clock... NOTA: clock sensível a borda de descida } output_bit(cmd,true); //sobe comando para sinalizar delay_us(tempoEntreByte); //espera um tempinho entre um byte e outro } // --------------------------------------------------------------------------- // psxCopiaDado - copia buffer atual para anterior // --------------------------------------------------------------------------- void psxCopiaDado() { int i; for(i=0;i<6;i++) psxDadoAnt[i] = psxDado[i]; } // --------------------------------------------------------------------------- // psxComparaDado - Compara leitura anterior com a atual // --------------------------------------------------------------------------- boolean psxComparaDado() { int j; for(j=0;j<6;j++) { if(psxDadoAnt[j]!=psxDado[j]) return (1); } return (0); } // --------------------------------------------------------------------------- // psxAtualizaVariaveis - converte buffer de leitura para variaveis discretas // --------------------------------------------------------------------------- void psxAtualizaVariaveis() { if((psxDado[0] & 1) == 1) btnSelect = 1; else btnSelect = 0; if((psxDado[0] & 2) == 2) btnJoyE = 1; else btnJoyE = 0; if((psxDado[0] & 4) == 4) btnJoyD = 1; else btnJoyD = 0; if((psxDado[0] & 8) == 8) btnStart = 1; else btnStart = 0; if((psxDado[0] & 16) == 16) btnUp = 1; else btnUp = 0; if((psxDado[0] & 32) == 32) btnRight = 1; else btnRight = 0; if((psxDado[0] & 64) == 64) btnDown = 1; else btnDown = 0; if((psxDado[0] & 128) == 128) btnLeft = 1; else btnLeft = 0; if((psxDado[1] & 1) == 1) btnL2 = 1; else btnL2 = 0; if((psxDado[1] & 2) == 2) btnR2 = 1; else btnR2 = 0; if((psxDado[1] & 4) == 4) btnL1 = 1; else btnL1 = 0; if((psxDado[1] & 8) == 8) btnR1 = 1; else btnR1 = 0; if((psxDado[1] & 16) == 16) btnTriangulo = 1; else btnTriangulo = 0; if((psxDado[1] & 32) == 32) btnQuadrado = 1; else btnQuadrado = 0; if((psxDado[1] & 64) == 64) btnXis = 1; else btnXis = 0; if((psxDado[1] & 128) == 128) btnBola = 1; else btnBola = 0; x_right = psxDado[2]; y_right = psxDado[3]; x_Left = psxDado[4]; y_Left = psxDado[5]; } // ---------------------------------------------------- // psxLeControle - Executa a leitura do controle de playstation // ---------------------------------------------------- void psxLeControle() { int psxByte = 0; output_bit(cmd,true); //sobe comando output_bit(clk,true); //sobe clock output_bit(att,false); //att em low - habilita o joystick delay_us(tempoInicio); //aguarda o controle entender o att em low //Envia o primeiro byte para o controle - 0x01 psxByte = 1; psxGravaByte(psxByte); //Envia o segundo byte para o controle - 0x42h psxByte = 66; psxGravaByte(psxByte); //Envia o terceiro byte para o controle - 0x00 psxByte = 0; psxGravaByte(psxByte); //Recupera os 6 próximo bytes for(psxCont=0; psxCont<6; psxCont++) psxDado[psxCont] = psxLeByte(); //Volta o att para alto... libera o controle indicando que ele pode parar de enviar dados output_bit(att,true); //Compara com a variável anterior e verifica se será //necessário atualizar as variaveis discretas if(psxComparaDado()==1) { psxAtualizaVariaveis(); psxMudou = true; } else psxMudou = false; psxCopiaDado(); }