c ++ raspberry pi 4 - Получить ввод с клавиш клавиатуры без ввода / проверки? - PullRequest
0 голосов
/ 13 февраля 2020

Я долго искал, и мне не удалось найти какой-либо способ получить клавиши ввода моей клавиатуры, чтобы использовать их в моей программе ...

Context: I ' Я начинаю с робототехники и C ++, и я просто хотел бы командовать мотором. Идея состоит в том, что «если я нажимаю стрелку вверх, двигатель вращается, если я нажимаю стрелку вниз, двигатель останавливается» и все, не нужно проверять что-то или что-то в этом роде ...

I Я с Rasbian, через VN C (управление с моего реального компьютера), и фактический код выполняется в терминале.

Я посмотрю позже, чтобы сделать это более сложным.

Я просмотрел 20 и более страниц и не нашел ничего полезного ... Разве нет простого способа сделать что-то, что кажется настолько полезным?

Некоторые говорили о библиотеке conio, но, видимо, она устарела curses / ncurses занял свое место, но я не смог найти / заставить что-то работать ... http://www.cplusplus.com/forum/general/74211/

Создать функцию для проверки нажатия клавиш в unix с помощью ncurses

Захватывать символы со стандартного ввода без ожидания нажатия клавиши ввода

Это, очевидно, код C, а не C ++, Более того, я не очень понимаю, что ... Как обнаруживать нажатия клавиш в программе Linux C GUI без запроса пользователя?

Это, может быть? Но это не имеет смысла для меня (новичок в C ++) Как я могу получить состояние клавиатуры в Linux?

здесь они говорят о "allegro", но, видимо, это не так пока не работаю на PI 45 ... и не знаю, как его установить в любом случае http://www.cplusplus.com/forum/general/47357/

Кто-нибудь знает простой маленький код, который я могу скопировать, чтобы сделать это, или как? Я очень шокирован, что у меня нет ничего похожего на windows C ++ программирование, где это кажется таким простым

Я имею в виду что-то вроде "Keyboard.GetKeyStates (Key)"

Я продолжу свой В любом случае, но, пожалуйста, помогите!

РЕДАКТИРОВАТЬ:

Очевидно, библиотека SDL (SDL2) может помочь мне сделать это ... Я пытался реализовать это, это не дает никакого результата ...

Вот код, который я получил до сих пор (я удалил большую часть, которая здесь бесполезна), по сути, это копия прошлого из inte rnet Официальная веб-страница SDL:

#include <iostream>
#include <wiringPi.h>   //Raspberry pi GPIO Library
#include <cstdio>
#include <csignal>
#include <ctime>
#include <chrono>   //library for counting time
#include <thread>   //for "this thread sleep"
#include <SDL2/SDL.h>   //for getting the keyboard buttons events

bool RUNNING = true;    // global flag used to exit from the main loop

/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  GPIO Pins definition
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
int SPser = 13, SPclk = 19, SPrclk = 26; //Define the output pins used
int Optocoupler = 17; //define the input pins used

/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  SDL definition
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*/

    //void PrintKeyInfo( SDL_KeyboardEvent *key );
    //void PrintModifiers( SDLMod mod );

//SOME CODE

// Callback handler if CTRL-C signal is detected
void my_handler(int s) {
    std::cout << "Detected CTRL-C signal no. " << s << '\n';
    RUNNING = false;
}

//###################################################################################
int main(int argc, char *args[]) {
    // Initialize wiringPi and allow the use of BCM pin numbering
    wiringPiSetupGpio();

    //Initialize SDL
    if (SDL_Init(SDL_INIT_EVENTS) != 0) {
        SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
        return 1;
    }
    else
    {
        SDL_Log("SDL initialized");
    }
    SDL_Event event;

    // Register a callback function to be called if the user presses CTRL-C
    std::signal(SIGINT, my_handler);

    while(RUNNING) 
    {

    while( SDL_PollEvent( &event ) )
    {
    std::cout << "SDL While \n" << '\n';
        //When the user presses a key
        switch( event.type )
        {
        case SDL_KEYDOWN:
        std::cout << "Key press detected \n" << '\n';
            //printf( "Key press detected\n" );
        break;

        case SDL_KEYUP:
        std::cout << "Key release detected \n" << '\n';
            //printf( "Key release detected\n" );
        break;

        default:
        break;
        }
    }
//std::cout << "Works??" << '\n';

    /*for( i = 0; i <= 15; i++ )
    {
        //std::cout << "data input i =" << i << '\n';
        if (i==0){
        //std::cout << "if array " << i << '\n';
        DataArr[i]=1;
        DataArr[15]=0;
        }
        else{
            j=i-1;
            DataArr[j]=0;
            DataArr[i]=1;
            //std::cout << "in else i" << i << " and j " << j << '\n';
        }
    SendData(DataArr);
    }*/
    }
    std::cout << "Program ended ...\n";
}

Поскольку я следовал "тупому" руководству, это должно работать, но пока l oop никогда не вводится как "std :: cout <<" SDL While \ n "<< '\ n';" никогда не показывается ... </p>

Но, как это удается для компиляции, я думаю, библиотека SDL была установлена ​​правильно и все работает ...

При выполнении кода он пишет "SDL инициализирован ", тогда ничего ... нажатие клавиш ничего не делает

Я все еще не уверен, как проверить, правильно ли установлена ​​библиотека, но когда я набираю в командной строке de" sudo apt-get install libsdl2- dev ", он показывает несколько строк и говорит" 0 обновлено, 0 вновь установлено, 0 удалено и 0 не обновлено "

1 Ответ

2 голосов
/ 20 февраля 2020

Если вы используете linux, вы должны использовать термин ios, чтобы остановить буферизацию

#include <termios.h>

void set_no_buffer()
{
     struct termios term;
     tcgetattr(0, &term);
     term.c_lflag &= ~ICANON;
     tcsetattr(0, TCSANOW, &term);
}

, а затем getchar(), чтобы получить символ без ввода

...