Hebang
(usa Arch Linux)
Enviado em 17/04/2011 - 23:52h
Ola Angelox!
Bom, nunca tinha visto coisa do tipo na frente, mas seguindo a lógica e pelo nome das variáveis dá pra ter uma idéia.
Vamos lá:
1) fd = open("/dev/input/event0", O_RDONLY);
Todo dispositivo acoplado do Linux gera um arquivo no diretório /dev/. Esses arquivos são utilizados principalmente por drivers que fazem a interface entre o device e o software. Esse arquivo serve como um pipe entre device e software. Então, beeeeem simplificadamente, se voce escrever algo nesse arquivo, essa informacao vai para o device. Da mesma maneira, se o device escrever algo nesse arquivo, voce pode ler. Como o arquivo é aberto com O_RDONLY, fd recebe um ponteiro para esse arquivo aberto apenas como leitura.
2) rd = read(fd, ev, sizeof(struct input_event) * 64);
Aqui ele joga na estrutura rd o que esta escrito no arquivo aberto. "read" é um dos métodos básicos escritos por todo driver. Estão, nessa linha, basicamente voce le o estado do dispositivo e joga na estrutura "rd". Como pode ver, ele utiliza o tamanho da estrutura "input_event". Logo, ele deve carregar os status dos dispositivos de entrada do seu celular (pressionar uma tecla, abrir o flip, etc).
3) for (i = 0; i < rd / sizeof(struct input_event); i++)
Por se tratar de um celular, obviamente ele não controla apenas o abrir e fechar do flip, mas sim vááááárias coisas. Aqui ele percorre as várias informacoes que essa estrutura retornou e trata elas com os if's abaixo.
4) if (ev[i].type != EV_SYN)
Essa linha me parece a crucial. Como voce disse que o seu programa detecta quando o flip do celular é aberto ou fechado, essa linha deve verificar se a informacao acessada no momento pelo for é relativa ao flip do seu celular. Se for, ele entra nesse if e faz mais algumas verificacoes.
5) if (ev[i].value != NCLOSE) printf("Aberto\n");
if (ev[i].value == NCLOSE) printf("Fechado\n");
Se o codigo chegou aqui,é sinal que ev[i] armazena informacoes sobre o flip do celular. Então é o seguinte: o primeiro if verifica se o flip NÃO está fechado (NCLOSE). Se isso for verdade, ele está aberto (dããã), então imprime "aberto". O segundo if é o if de cima com a lógica negada. Logo, se o flip estiver fechado, escreve "Fechado".
Bom, apesar de não entender nada desse celular para o qual está programando, esse seu código nada mais é que uma camada acima do driver (se não for o próprio driver).
Se tiver interesse (e tempo), vale a pena dar uma lida sobre device drivers no Linux. É uma parte muuuuito interessante do sistema, mas pouco explorada pelo pessoal. Após ler sobre eles, muita coisa que você fará para seu celular vai despertar em sua mente um "ei, eu já vi isso antes" :)
Espero ter ajudado (e não ter dito nenhuma besteira :P)!