Теперь у меня есть следующая функция. Но то, что мне нужно улучшить, это то, что он будет читать ввод с клавиатуры (на терминале) ДАЖЕ, ЧТО ЭТО НЕ БЫЛО ПРЕКРАСНО. Мне нужно знать, когда он НЕ нажат (в режиме ожидания), чтобы блок switch case
попал в раздел default
. На этом этапе функция read()
ждет, пока не появится вход пользователя. Может ли кто-нибудь дать предложение только на основе изменения этого следующего кода? ПРИМЕЧАНИЕ. Я программист на Java и все еще изучаю C/C++, поэтому мне может быть трудно получить немного в голове. Спасибо, ребята ..Чтение неблокирующей клавиатуры - C/C++
EDIT: Я нашел эту ссылку и, похоже, что-то связано с тем, что я ищу на линии fcntl(STDIN_FILENO,F_SETFL,flags | O_NONBLOCK);
. Но так как я почти ничего не знаю о C, у меня совершенно нет идеи, что она говорит.
http://www.codeguru.com/forum/showthread.php?t=367082
int kfd = 0;
struct termios cooked, raw;
char c;
bool dirty = false;
//get the console in raw mode
tcgetattr(kfd, &cooked);
memcpy(&raw, &cooked, sizeof(struct termios));
raw.c_lflag &=~ (ICANON | ECHO);
// Setting a new line, then end of file
raw.c_cc[VEOL] = 1;
raw.c_cc[VEOF] = 2;
tcsetattr(kfd, TCSANOW, &raw);
puts("Reading from keyboard");
puts("=====================");
puts("Use arrow keys to navigate");
while(true){
//get the next event from the keyboard
if(read(kfd, &c, 1) < 0)
{
perror("read():");
exit(-1);
}
linear_ = angular_ = 0;
ROS_DEBUG("value: 0x%02X\n", c);
switch(c)
{
case KEYCODE_L:
ROS_DEBUG("LEFT");
angular_ = -1.0;
dirty = true;
break;
case KEYCODE_R:
ROS_DEBUG("RIGHT");
angular_ = 1.0;
dirty = true;
break;
case KEYCODE_U:
ROS_DEBUG("UP");
linear_ = 1.0;
dirty = true;
break;
case KEYCODE_D:
ROS_DEBUG("DOWN");
linear_ = -1.0;
dirty = true;
break;
default:
ROS_DEBUG("RELEASE");
linear_ = 0;
angular_ = 0;
dirty = true;
break;
}
Вместо использования termios непосредственно, я рекомендую использовать что-то вроде [Ncurses] (HTTP: //en.wikipedia .org/вики/Ncurses). [Здесь] (http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html) - это учебное пособие, в котором показано, как получить ключи неблокирующимся способом. –
Невозможно просто изменить этот код, не так ли? Я просто хочу прочитать ввод с клавиатуры с терминала (забыл упомянуть об этом). Конечно, моим последним средством было бы узнать
ncurses
, но мне уже трудно учиться C/C++. –@JoachimPileborg Я отредактировал свой вопрос с (как я думаю,) ссылкой. Вы думаете, что знаете, о чем это говорит? –