#include using namespace std; // Estrutura para descrever o estado de uma chave struct KeyState { int key_number; // Número da chave bool state; // Estado da chave int when; // Horário em que a chave mudou de estado (em milissegundos) }; // Funções Externas. Precisam ser implementadas em outros arquivos. extern bool OpenConnection(void); // Abre a conexão (retorna false se falhar) extern void CloseConnection(void); // Fecha a conexão extern bool ReadKey(int key); // Lê o estado da tecla "key" extern void Init(void); // Inicia o hardware (interrup, timer, etc). extern void SendKeyState(KeyState *e); // Envia o estado de uma tecla pelo canal // Período das interrupções do temporizador (10 ms) const int c_clock_tick_period = 10; // Contador global de tempo. Incrementado de 'c_clock_tick_period' // após cada interrupção volatile int time_counter = 0; // Flag do temporizador. // A rotina da interrupção passa este flag para 'true'. O laço principal // (função main) retorna este flag para 'false' volatile bool clock_tick = false; // Este vetor é a fila de mensagens que aguardam para serem transmitidas // pelo canal de comunicação. vector MessageQueue; //------------------------------------------------------------------------ // Função DebounceKeys // Periodicamente lê o estado das teclas. Se uma tecla mudar de estado // e permanecer neste estado por 20 ms, insere uma mensagem no // pipe "MessageQueue". //------------------------------------------------------------------------ void DebounceKeys(void) { const int c_number_of_keys = 3; // Período de leitura das chaves (20ms) const int c_debounce_period = 20; // Temporizador de leitura das chaves. As chaves são lidas quando este // valor chegar a zero. static int debounce_timer = c_debounce_period; // Registrador de debounce. Cada elemento do vetor representa uma chave. // Os 4 bits menos significativos de cada elemento armazenam as 4 últimas // leituras das chaves. static int key_status[c_number_of_keys]; static bool init = true; if (init == true) { memset( key_status, 0, sizeof(key_status) ); init = false; } // Contando o tempo para verificar as teclas debounce_timer -= c_clock_tick_period; // Está na hora de verificar as teclas? (1 vez a cada 20 ms) if ( debounce_timer <= 0) { // Reinicia o contador para a próxima verificação debounce_timer = c_debounce_period; // Verifica cada uma das teclas for (int i=0; i