Como esse código funciona?

1. Como esse código funciona?

Angelo S. Mavridis Bartolome
barklome

(usa Slackware)

Enviado em 17/04/2011 - 23:27h

Bom pessoal,fiz esse código baseado no evtest.c,desenvolvo para embedded linux,e esse codigozim que eu fiz serve para verificar se o flip de um celular que roda minha distribuição linux está aberta ou fechada. O código funciona perfeitamente,mas gostaria de saber como ele funciona. :$
Estranho né o cara faz o código e não sabe como funfa kkk
Se alguém comentar ele já ajuda pakas..a unica parte que eu não to pegando bem é como ele seta as variáveis EV_SYN e ev[i].value..o resto de boa... Valeu pessoal:
Códigos:
Meu código: http://pastebin.com/R2JLNKLi
Código em que eu me baseei:http://pastebin.com/9L215f7y

Valeu desculpa pelo português mal escrito,kkk fui na pressa mesmo


  


2. Re: Como esse código funciona?

Mauricio Souza Klein
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)!


3. Re: Como esse código funciona?

Angelo S. Mavridis Bartolome
barklome

(usa Slackware)

Enviado em 18/04/2011 - 12:50h

valeu cara,só ainda não entendi muito bem a parte do EV_SYN...o resto você ajudou bastante,eu reprogramei tudinho até a parte do nclose,deixei esse EV_SYN porque não sabei como funciona,e tá dificil pra intender kkkk
Mas valeu,vou ler um pouco dos device drivers :)







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts