LINUX.ORG.RU

аналог GetAsyncKeyState???


0

0

Есть в винде такая вот функция (GetAsyncKeyState), которая, работая асинхронно, возвращает код последней нажатой клавиши. Нужен аналог сабжа но под Linux.

Есть утилита (на самом деле банальный тест на работоспособность неких драйверов к некой плате цифровой обработки сигналов) который эмулирует некий механизм работы с железкой, которая в бесконечном цикле получает от железки данные, а по нажатию разнообразных клавиш отправляет железяки разнообразные сообщения (читай короткие массивы байт). Все это работает без какого либо GUI в чистой консоли, и не тащит за собой других библиотек, ибо призван максимально малым колличеством кода продемонстрировать не работоспособность дров, без вопросов собираться на машине у разработчика, у которого этих библиотек может неоказатья.

Единственное, что пока удалось найти из стандартного, это aio, но во первых это всеже не совсем то, что нужно ибо механизм реализован на чтении стандартного ввода и без нажатия enter не работает, а вовторых, применимо к моему случаю, просто костыль, да и работает пока не совсем понятно как, ибо при вызове aio_return возвращает всегда 0 в случае если ввода вообще не было или -1 в противном случае??? Да еще порождает туеву хучу потоков (минимум 1).

Может кто сталкивался с чем-то подобным, посоветуйте куда копать, желательно без установки дополнительных библиотек.


Ответ на: комментарий от naryl

скорее всего тебе нужен ncurses или slang. какая именно ф-я не подскажу. еще мож попробовать select()/read() на stdin но можеш зарытся

cvv ★★★★★
()

/*
 * Читает из stdin без буферизации ввода.
 * Работает в GNU/Linux.
 */

#include <stdio.h>
#include <math.h>
#include <sys/time.h>
#include <termios.h>
#include <unistd.h>

#define W	80
#define H	40

#define TRSTP	0.1
#define ANGSTP	0.05
#define MOVSTP	0.1
#define ROTSTP	2

double px = 4, py = 4, pa = 0;
char map[10][10] = {	
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 4, 4, 0, 0, 0, 0, 0, 0, 1},
  {1, 4, 4, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 2, 2, 0, 1},
  {1, 0, 0, 0, 0, 0, 2, 2, 0, 1},
  {1, 0, 3, 3, 0, 0, 0, 0, 0, 1},
  {1, 0, 3, 3, 0, 0, 0, 0, 0, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
};

void
render ()
{
  double x, y, l, a;
  int tx, ty, th, i, h;
  write (1, "\033[1;1f", 6);
  char *m = (int *) calloc (W * H + H, 1);
  memset (m, 0x20202020, W * H + H);
  for (i = W; i < W * H + H; i += W + 1)
    m[i] = '\n';

  for (a = 0; a < 90; a += ANGSTP)
    {
      x = px;
      y = py;
      l = 0;

      while ((h = map[(int) x][(int) y]) == 0 && x > 0 && y > 0 && x < 9
	     && y < 9)
	{
	  x += cos ((a - 45 + pa) * M_PI / 180) * TRSTP;
	  y += sin ((a - 45 + pa) * M_PI / 180) * TRSTP;
	  l += TRSTP;
	}

      tx = a / 90 * W;
      ty = H / 2 / l;
      th = 16 / l;

      while (th--)
	{
	  if (tx >= 0 && tx < W && ty >= 0 && ty < H)
	    m[tx + (W + 1) * ty] = '#' + h - 1;
	  ty++;
	}

    }

  write (1, m, W * H + H);
}

int
main ()
{
  char c;
  struct termios t;
  double nx, ny;

  tcgetattr (0, &t);
  t.c_lflag &= ~ICANON;
  tcsetattr (0, TCSANOW, &t);

  while (1)
    {
      render ();
      read (0, &c, 1);
      switch (c)
	{
	case 's':
	  nx = px - cos (pa * M_PI / 180) * MOVSTP;
	  ny = py - sin (pa * M_PI / 180) * MOVSTP;
	  break;
	case 'w':
	  nx = px + cos (pa * M_PI / 180) * MOVSTP;
	  ny = py + sin (pa * M_PI / 180) * MOVSTP;
	  break;
	case 'a':
	  pa -= ROTSTP;
	  if (pa < 0)
	    pa += 360;
	  break;
	case 'd':
	  pa += ROTSTP;
	  if (pa >= 360)
	    pa -= 360;
	  break;
	}
      if (!map[(int) nx][(int) ny])
	{
	  px = nx;
	  py = ny;
	}
    }
}

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

и все-таки , пожалуй , slang проще всего
там в подкаталоге демо есть пример - keypad - который возвращает код нажатой клавиши
причем понимает утф

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