LINUX.ORG.RU

Нажать и отпустить кнопку :)


0

0

Здравствуйте.
Можно ли как то сделать такую тему на Це:
при нажатии на к.-либо клавишу на клавиатуре
чтоб выполнялось нечто, а после того как я клавишу
отпущу, то выполнялось другое действие.

Нормально обьяснить не получилось), вот пример:
нажимаю я "1", по нажатию выполняется ++a, а как
только отпущу, то --a :)
Прошу прощение за возможно глупый вопрос)


в общем случае - да

а в конкретном - зависит от конкретного случая и мозгов программиста

:)

PS:правильно сформулированный вопрос - половина ответа

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

Вобщем это драйвер для машинки.
Надо чтоб она ехала вперед, например, только во время того, как
я удерживаю, например "1". Можно, конечно, еще сделать "тормоз", но
это не то получится. Так вот :)

pisun
() автор топика

попробуйте аналог борландовского kbhit()
где-то в сети встретил рецептик

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>

int
main(int argc, char **argv) {
   int c;
   struct termios tio;
   tcflag_t old_lf;
   long old_fl;

   /* fgetc() won't block */
   old_fl = (long) fcntl(0, F_GETFL);
   fcntl(0, F_SETFL, O_NONBLOCK);

   /* disable buffering by lines... and some more. see termios(2) */
   tcgetattr(0, &tio);
   old_lf = tio.c_lflag;
   tio.c_lflag &= ~(ICANON | ECHO);
   tcsetattr(0, TCSANOW, &tio);

   while (EOF == (c = fgetc(stdin))) {
       /* do something good unless key is pressed */
   }
   printf("User pressed key 0x%02x\n", c);

   /* be a good boy and restore initial settings */
   tcgetattr(0, &tio);
   tio.c_lflag = old_lf;
   tcsetattr(0, TCSANOW, &tio);
   fcntl(0, F_SETFL, old_fl);

   return 0;
}

sts
()
Ответ на: комментарий от cvv

sts, спасибо, приму во внимание.
А что там с ncurses?

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

>хотите тащить либу - пожалуйста, кто ж запрещает.
не очень хочу. Просто хочу посмотреть несколько вариантов,
и самый гуд выбрать. Ваш, поверьте мне, тоже ничего ;)

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

$showkey 
режим клавиатуры был RAW
нажмите на клавишу `any' (она на системном блоке)...

Шутники :)

А в состав какого пакета showkey входит?

Товарищ sts, Вам вопрос. Я все никак не вкурю. Смотри:

while (EOF == (c = fgetc(stdin))) {
       /* do something good unless key is pressed */
   }
   printf("User pressed key 0x%02x\n", c);

printf выполнится после того как клавишу отпущу?

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

насколько я знаю консоль такая штука что работать с ней напрямую стоит разве что в rc скриптах. во всех остальных случаях куда менее гимморно тащить за собою ncurses или S-Lang

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

2pisun

Трудно компильнуть что-ли? printf выполнится после нажатия клавиши.
Логику нажатий клавиш старт-стоп можете сами придумать ;))) Я бы сделал так - нажал 1 поехали, пока не нажата другая клавиша движение продолжается. Ну а как там в реальности устроена железка мне неведомо, смотрите сами.


2cvv

Гемор, не гемор... это философия. Покажите свой вариант, сравним.

sts
()
Ответ на: комментарий от sts

>Трудно компильнуть что-ли?
Да. Все завтра буду делать, сейчас времени нет совсем :(

>Я бы сделал так - нажал 1 поехали, пока не нажата другая клавиша
>движение продолжается.
вот это и надо переделать. При такой схеме управления управлять
машинкой неудобно :)

Всем спасибо. Остановлюсь на варианте sts.

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

Накидал вот, попробывать, а не хочет работать :(

#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>
#include <termios.h>
#include <fcntl.h>

#ifdef __sparc__
#  error "This program can't compile or run on the Sparc platform"
#endif

#ifdef __alpha__
#include <sys/io.h> /* ioperm */
#endif

int main(int argc, char **argv) 
{
   int c;
   struct termios tio;
   tcflag_t old_lf;
   long old_fl;

   setuid(0);
   old_fl = (long) fcntl(0, F_GETFL);
   fcntl(0, F_SETFL, O_NONBLOCK);
   tcgetattr(0, &tio);
   old_lf = tio.c_lflag;
   tio.c_lflag &= ~(ICANON | ECHO);
   tcsetattr(0, TCSANOW, &tio);

   if (ioperm(0x378,1,1)) {printf("ioperm(): %s\n",strerror(errno)); exit(1);}

   do {   
       while (EOF == (c = fgetc(stdin))) {
                
                if (c==56) { outb(0x0016, 0x378); printf("bla-bla");}

          }
       printf("%d",c); 
       printf("qweqwe");
       outb(0x0000, 0x378);
       
  } while (c!=48);


   tcgetattr(0, &tio);
   tio.c_lflag = old_lf;
   tcsetattr(0, TCSANOW, &tio);
   fcntl(0, F_SETFL, old_fl);
   return 0;
}

56 - код клавиши 8 (под CapsLock которая),
при нажатии получаю 56qweqwe, а если клавишу не отпускать, то 
56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe
56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe
56qweqwe56qweqwe56qweqwe56qweqwe56qweqwe....
при нажатии на "0" (код 48), цикл завершается :(
Получается, что сюда не заходит вовсе:

while (EOF != (c = fgetc(stdin))) {
        if (c==56) { outb(0x0016, 0x378); printf("bla-bla");}
  }

В чем дело может быть?

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

Напутал млять :/ Вот "пробно-рабочий" вариант.

#include <stdio.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <asm/io.h>
#include <termios.h>
#include <fcntl.h>


#ifdef __sparc__
#  error "This program can't compile or run on the Sparc platform"
#endif

#ifdef __alpha__
#include <sys/io.h> /* ioperm */
#endif

int main(int argc, char **argv) 
{
   int c;
   struct termios tio;
   tcflag_t old_lf;
   long old_fl;

   setuid(0);
   old_fl = (long) fcntl(0, F_GETFL);
   fcntl(0, F_SETFL, O_NONBLOCK);
   tcgetattr(0, &tio);
   old_lf = tio.c_lflag;
   tio.c_lflag &= ~(ICANON | ECHO);
   tcsetattr(0, TCSANOW, &tio);

   if (ioperm(0x378,1,1)) {printf("ioperm(): %s\n",strerror(errno)); exit(1);}

   do {   
       while (EOF == (c = fgetc(stdin))) {
                         outb(0x0000, 0x378);   
         }
     if (c==56) { outb(0x0016, 0x378); printf("!!8!!\n");}

  } while (c!=48);


   tcgetattr(0, &tio);
   tio.c_lflag = old_lf;
   tcsetattr(0, TCSANOW, &tio);
   fcntl(0, F_SETFL, old_fl);
   return 0;
}

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

Вобщем конечно для переносимости лучше использовать ncurses+ppdev,
если есть желание распространить код и железку. А насколько я понял
это единственный экземпляр ;)))

зы с интересом взгляну на ваш вариант.

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