Ir ao conteúdo
  • Cadastre-se

C para Hardware


thyagoop

Posts recomendados

Seguinte galera vou tentar explicar o que esta acontecendo, eu tenho um aparelho com um LCD e 4 botões, estou criando um menu com eles. O quarto botão eu quero fazer o seguinte, uma contagem regressiva de 10 segundos, se caso o cliente soltar o botão o aparelho não é reiniciado. Somente se o cliente mantiver o 4º botão pressionado durante 10 segundos o o aparelho é reiniciado.

Vou postar o código, pra ver se ajuda...

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "plcm-util.h"

void escreve_linha_1(struct _plcm plcm, int devfd) {

plcm.amg = 1;

ioctl(devfd, PLCM_IOCTL_SET_LINE, &plcm);

}

void escreve_linha_2(struct _plcm plcm, int devfd) {

plcm.amg = 2;

ioctl(devfd, PLCM_IOCTL_SET_LINE, &plcm);

}

void stop(struct _plcm plcm, int devfd) {

plcm.amg = 0;

ioctl(devfd, PLCM_IOCTL_STOP_THREAD, &plcm);

}

void DispOff(struct _plcm plcm, int devfd) {

plcm.amg = 0;

ioctl(devfd, PLCM_IOCTL_DISPLAY_D, &plcm);

}

void DispOn(struct _plcm plcm, int devfd) {

plcm.amg = 1;

ioctl(devfd, PLCM_IOCTL_DISPLAY_D, &plcm);

}

/*FUNCOES PARA A LEITURA DO QUE ESTA ESCRITO NAS LINHAS DO LC*/

void read_1(int devfd, struct _plcm plcm, FILE *saida, unsigned char Ret_Message1) {

plcm.amg = 2;

ioctl(devfd, PLCM_IOCTL_SET_LINE, &plcm);

read(devfd, Ret_Message1, sizeof (Ret_Message1));

fprintf(saida, "A primeira linha do LCM1: %s\n", Ret_Message1);

}

void read_2(int devfd, struct _plcm plcm, FILE *saida, unsigned char Ret_Message2) {

plcm.amg = 2;

ioctl(devfd, PLCM_IOCTL_SET_LINE, &plcm);

read(devfd, Ret_Message2, sizeof (Ret_Message2));

fprintf(saida, "A segunda linha do LCM1: %s\n", Ret_Message2);

}

/*FUNCAO PARA LIMPAR O LCD*/

void clear(struct _plcm plcm, int devfd) {

plcm.amg = 0;

ioctl(devfd, PLCM_IOCTL_CLEARDISPLAY, &plcm);

plcm.amg = 0;

ioctl(devfd, PLCM_IOCTL_RETURNHOME, &plcm);

}

int main(int argc, char *argv[]) {

struct _plcm plcm;

int devfd,forking = 1;

int botao1 = 1, botao2 = 1, botao3 = 1, botao4 = 1, inicio = 1;

unsigned char Keypad_Value = 0, Pre_Value = 0, Counter = 0, count = 0;

unsigned char Ret_Message1[40] = ""; //variavel que vai salvar o que esta escrito na primeira linha do lcd

unsigned char Ret_Message2[40] = ""; //variavel que vai salvar o que esta escrito na segunda linha do lcd

unsigned char Keypad_Message[40] = "";

unsigned char detect_press;

unsigned char detect_dir;

FILE *saida_read = fopen("saida_read.txt", "w");

pid_t pid, sid;

pid = fork();

if (pid < 0) {

exit(EXIT_FAILURE);

}

if (pid > 0) {

exit(EXIT_SUCCESS);

}

umask(0);

openlog("gSafe", LOG_PID, LOG_DAEMON);

sid = setsid();

if (sid < 0) {

exit(EXIT_FAILURE);

}

if ((chdir("/")) < 0) {

exit(EXIT_FAILURE);

}

close(STDIN_FILENO);

close(STDOUT_FILENO);

close(STDERR_FILENO);

fds[0].FD = open("/dev/plcm_drv", O_RDWR);

//devfd = open("/dev/plcm_drv", O_RDWR);

if (devfd == -1) {

printf("Cant open: /dev/plcm_drv\n");

return -1;

}

Keypad_Message[40] = "";

Keypad_Value = 0xaf;

stop(plcm, devfd);

DispOn(plcm, devfd);

clear(plcm, devfd);

goto principal;

/*

printf("O valor de detect_dir e: %x\n", detect_dir);

printf("O valor de detect_press e: %x\n", detect_press);

printf("O valor de Keypad_Value e: %x\n", Keypad_Value);

*/

while (1) {

plcm.amg = 0;

ioctl(devfd, PLCM_IOCTL_GET_KEYPAD, &plcm); // Get keypad

Keypad_Value = plcm.key_value; // Add the value to our local variable

detect_press = (Keypad_Value & 0x40);

detect_dir = (Keypad_Value & 0x28);

switch (Keypad_Value) {

case 0x87:

if (Pre_Value != Keypad_Value) {

/*printf("\nO valor de detect_dir dento do case 0 e: %x\n", detect_dir);

printf("O valor de detect_press dento do case 0x0 e: %x\n", detect_press);*/

strcpy(Keypad_Message, "Status de Firewall ");

read_1(devfd, plcm, &saida_read, Ret_Message1);

inicio = 0;

while (botao2 == 0) {

botao2 = 1;

escreve_linha_1(plcm, devfd);

//strcpy(Keypad_Message, "Status de Firewall ");

write(devfd, " Status de Firewall ", 40);

escreve_linha_2(plcm, devfd);

//strcpy(Keypad_info, " ");

write(devfd, " ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

//strcpy(Keypad_Message2, "Estados de Firewall ");

write(devfd, " Estados de Firewall ", 40);

escreve_linha_2(plcm, devfd);

//strcpy(Keypad_info2, " *informações* ");

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

//strcpy(Keypad_Message3, "Regras ");

write(devfd, " Regras ", 40);

escreve_linha_2(plcm, devfd);

//strcpy(Keypad_info3, " *informações* ");

write(devfd, " *informações* ", 40);

sleep(2);

// inicio = 1;

goto principal;

}

// detect_dir = 0x01;

}

break;

case 0xa7:

if (Pre_Value != Keypad_Value) {

strcpy(Keypad_Message, "Status do Sistema ");

inicio = 0;

while (botao1 == 0) {

botao1 = 1;

escreve_linha_1(plcm, devfd);

write(devfd, " Status do Sistema ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Status da Memoria ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Temperatura ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Processos ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Armazenamento ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Swap ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

//inicio = 1;

goto principal;

}

}

break;

case 0x8f:

if (Pre_Value != Keypad_Value) {

// printf("\nO valor de detect_dir dento do case 0x08 e: %x\n", detect_dir);

// printf("O valor de detect_press dento do case 0x08 e: %x\n", detect_press);

strcpy(Keypad_Message, "Status de Rede ");

while (botao3 == 0) {

botao3 = 1;

escreve_linha_1(plcm, devfd);

write(devfd, " Status de Rede ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Colisoes ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Numero de FIBs ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Numero de Rotas ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Sockets ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

sleep(2);

escreve_linha_1(plcm, devfd);

write(devfd, " Conexoes ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, " *informações* ", 40);

goto principal;

}

}

//detect_dir = 0x01;

break;

case 0xaf:

if (Pre_Value != Keypad_Value) {

goto principal;

}

break;

}

switch (detect_press) {

case 0x40:

/* printf("O valor de detect_dir e: %x\n", detect_dir);

printf("O valor de detect_press e: %x\n", detect_press);

printf("O valor de Keypad_Value e: %x\n", Keypad_Value);*/

switch (detect_dir) {

case 0x00:

botao2 = 0;

break;

case 0x20:

botao1 = 0;

break;

case 0x08:

botao3 = 0;

break;

case 0x28:

count = 0;

escreve_linha_1(plcm, devfd);

write(devfd, "O aparelho sera desligado ", 40);

escreve_linha_2(plcm, devfd);

write(devfd, "em 5 segundos ", 40);

//while (/*detect_dir == 0x28 &&*/ detect_press == 0x40) {

//detect_press = (Keypad_Value & 0x40);

// printf("O valor de detect_press que passa pela %d vez e: %x\n", count, detect_press);

if (count == 0) {

write(devfd, "dentro de 1 segundo ", 40);

count++;

}

//}

if (count == 1) {

write(devfd, "dentro de 2 segundos ", 40);

count++;

}

if (count == 2) {

write(devfd, "dentro de 3 segundos ", 40);

count++;

}

if (count == 3) {

write(devfd, "dentro de 4 segundos ", 40);

count++;

}

if (count == 4) {

// system("./desliga.sh");

write(devfd, "DESLIGANDO ", 40);

printf("*desliga\n\n");

close(saida_read);

return 0;

}

//}

break;

}

break;

case 0x00:

break;

}

if (Pre_Value != Keypad_Value) {

//if (forking == 0) {

if (inicio == 0) {

syslog(LOG_NOTICE, "%x %s", plcm.key_value, Keypad_Message);

write(devfd, Keypad_Message, 40);

//inicio = 1;

}

//}

}

if (inicio == 1) {

principal:

/*Aqui escreve algumas informações do LCD*/

}

Pre_Value = Keypad_Value;

forking = 0;

sleep(1);

}

closelog();

exit(EXIT_SUCCESS);

}

OBS. Estou utilizando FreeBSD.

Conto com a ajuda de vocês!!

Valeu pessoal!

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!