#include /*********************************************************** Estas bibliotecas servem para acessar as portas de comunicacao assincronas do terminnal Autor: Fabian La Porta - Monitor de Lapro I - 2002/2 Email: fabian_la_porta@hotmail.com ***********************************************************/ #include #include static struct termios orig, newX; /************************************************************ Estas estruturas servem para capturar os eventos no terminal - Elas utilizam um array definido chamado ' c_cc[NCCS]', que define os caracteres especiais de controle e outro chamado 'c_lflag', que define as configuracoes locais. - NCCS eh uma das constante definidas na biblioteca. Aqui usaremos as seguintes: 1) VMIN: eh o numero minimo de caracteres que devem ser recebidos para completar a leitura. 2) VTIME: define se espera ate que todos os caracteres sejam lidos (a quantidade de caracteres a serem lidos eh definida em VMIN). 3) TCSANOW: faz com que as mudancas sejam executadas na na mesma hora. - O array 'c_lflag' utiliza as seguintes constantes para configuracoes locais: 1) ICANON: Habilita/Desabilita o 'modo canonico' (???). Serve para representar alguns caracteres especiais e buffers de linha. Se vc naum 'seta-lo', sera necessario pressionar [ENTER] para aparecer a tecla pressionada. 1) ECHO: Habilita/Desbilita echo no terminal. O 'ECHO' acontece quando vc digita uma tecla e ela aparece na tela. OBS: O simbolo '~' (til) nega um valor !!!!!! ************************************************************/ static int peek = -1; //Guarda se alguma tecla foi pressionada /******************************************************* Esta funcao verifica se alguma tecla foi pressionada *******************************************************/ int kbhit() { char ch; int nread; // ---- Verifica se algum caracter foi pressionado ---- // if(peek != -1) return 1; newX.c_cc[VMIN]=0; // ----- naum vai pegar nenhum caracter !!!! tcsetattr(0, TCSANOW, &newX); // --- Atualiza configuracao nread = read(0,&ch,1); // --- Verifica se foi pressionada alguma tecla newX.c_cc[VMIN]=1; // ----- vai pegar apenas um caracter tcsetattr(0, TCSANOW, &newX); // --- Atualiza configuracao // ----- Verifica se leu alguma coisa ----- // if(nread == 1) { peek = ch; // ----- Guarda o que leu ... return 1; } return 0; } /******************************************************* Esta funcao le a última tecla que foi pressionada Se nada foi pressionado, ela retorna -1 *******************************************************/ int readch() { char ch; if(peek != -1) { // se leu alguma coisa ... ch = peek; peek = -1; return ch; // retorna o que leu !!!!! } return -1; } void InitKeyboard() { tcgetattr(0, &orig); newX = orig; // ----------------- Configura terminal ----------------- // newX.c_lflag &= ~ICANON;//naum sera necessario pressionar [ENTER] newX.c_lflag &= ~ECHO; //naum havera 'echo' no terminal newX.c_cc[VMIN] = 1; // sera lido um caracter por vez !!! newX.c_cc[VTIME] = 0; // nao havera espera para a leitura dos caracteres tcsetattr(0, TCSANOW, &newX); // atualiza configuraces do terminal }