2012-02-24 4 views
0

Теперь у меня есть следующая функция. Но то, что мне нужно улучшить, это то, что он будет читать ввод с клавиатуры (на терминале) ДАЖЕ, ЧТО ЭТО НЕ БЫЛО ПРЕКРАСНО. Мне нужно знать, когда он НЕ нажат (в режиме ожидания), чтобы блок 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; 
} 
+1

Вместо использования termios непосредственно, я рекомендую использовать что-то вроде [Ncurses] (HTTP: //en.wikipedia .org/вики/Ncurses). [Здесь] (http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html) - это учебное пособие, в котором показано, как получить ключи неблокирующимся способом. –

+0

Невозможно просто изменить этот код, не так ли? Я просто хочу прочитать ввод с клавиатуры с терминала (забыл упомянуть об этом). Конечно, моим последним средством было бы узнать ncurses, но мне уже трудно учиться C/C++. –

+0

@JoachimPileborg Я отредактировал свой вопрос с (как я думаю,) ссылкой. Вы думаете, что знаете, о чем это говорит? –

ответ

1

ОП, кажется, ответил на их вопрос:

Я думаю, что я решил мою проблему. Пожалуйста, кто-нибудь, подтвердите и дайте мне знать, если это правильный способ сделать это, или это полный способ сделать это (я пропущу какой-либо другой шаг добавления, например, сброс его обратно, если это даже имеет смысл).

Так что я нашел, чтобы добавить эти 3 строки перед входом в то время цикла:

flags = fcntl(0, F_GETFL, 0); /* get current file status flags */ 
flags |= O_NONBLOCK;   /* turn off blocking flag */ 
fcntl(0, F_SETFL, flags);   /* set up non-blocking read */ 
Смежные вопросы