LINUX.ORG.RU

Считывание нажатий клавиш и разница времени


0

1

Возникла такая трудность при написании кода.. Делается все на железки с арм процом и подключенным туда LCD дисплеем и телефонной клавиатуры Собственно суть вопроса такова. Если пользователь нажал клавишу Z вывести 1 сообщение и если он нажал клавишу Z в течении 3-х секунд с первого нажатия записать в файл новые данные и вернутся в главное меню Если же из главного меню клавиша Z не нажимается в течении 5 секунд выйти еще выше :) в самое главное меню. Понять не могу как учитывать время, если клавишу не нажималась вообще или нажалась только 1 раз

nt run_compressor_options(){
	FILE *compr, *resourse;
	time_t start, finish;
	char symbol, str[1], *temp, msg[40];
	unsigned short int hour, minut, sec, key, j = 0;
	float i = 0;													
	
	if ((compr = fopen("eeprom","rb+"))==NULL)		//Открываем файл из EEPROM для чтения ресурса компрессора
		printf("Не удается открыть файл для чтения");

	if ((resourse = fopen("res_compr","wb+"))==NULL)	//Открываем файл для записи в него форматированного ресурса компрессора
		printf("Не удается открыть файл для записи");
		
	while(!feof(compr)){										//Считаваем из EEPROM строку формата ЧЧЧЧ:ММ:СС
		fgets(str,12,compr);
	}
	
	temp = strtok(str,":");										//Разбиваем ее на ЧЧЧЧ ММ СС
	hour = atoi(temp);
	temp = strtok(NULL,":");
	minut = atoi(temp);
	temp = strtok(NULL,":");
	sec = atoi(temp);

	sprintf(msg,"РЕСУРС КОМПРЕССОРА  ЧС:%04d;МН:%2d;СЕК:%2d;",hour,minut,sec); 	//Записываем в msg строку для вывода на экран
	fputs(msg,resourse);														//Записываем ее в файл 
	lcd_print("res_compr", NO_CURSOR);
	
	while(1){
		key = get_pkey();														//Обработчик действий пользователя
		switch(key){
			case KEY_Z:						//int i = 14
				if (j==0)
					time(&start);
					rewind(resourse);
					sprintf(msg,"Счетчик ресурса обнулисть: Подтвердите...");
					fputs(msg,resourse);
					lcd_print("res_compr", NO_CURSOR);
				if (j==1){
					time(&finish);
					j=0;
				}
				i = difftime(start,finish);
				printf("\n%f\n",i);
				if ((i >=-3)&&(i <= 0)){
					rewind(resourse);
					sprintf(msg,"РЕСУРС КОМПРЕССОРА  ЧС:%s;МН:%s;СЕК:%s;","0000","00","00");
					fputs(msg,resourse);
					lcd_print("res_compr", NO_CURSOR);
					fclose(resourse);
					fclose(compr);
					exit(0);
				}
				j++;
			break;
			default:
				lcd_print("res_compr", NO_CURSOR); 	
		}				// End of switch
	}					// End of while


	fclose(resourse);
	fclose(compr);
	
	return 0;
	}

int main(){
	run_compressor_options();
	return 0;
}



Последнее исправление: Mish_ka (всего исправлений: 1)

Возможно, я просто не понял вашей проблемы, но я бы делал по такому алгоритму:

wait for key press
{
   key_press = get current time

   wait for key release
   {
      key_release = get current time
      time = key_release - key_press
      if time < X
      {
         do something useful
      }
      else if time < Y
      {
         do something useful
      }
      else if time < Z
      {
         do something useful
      }
   }
}

andreyu ★★★★★
()
Ответ на: комментарий от AIv

да, ждет нажатия.. С потоками пока не работал. Думаю переписать get_key, там может организовать ожидание секунд

Mish_ka
() автор топика
Ответ на: комментарий от AIv

Я не спец, но если Вы можете проверить состояние клавиши и лень связываться с потоками, то проще в get_key проверять нажата кнопка в данный момент или нет. ТОгда можно и в один поток залудить...

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.