2014-07-07 3 views
1

저는 라즈베리 파이에 상당히 익숙합니다.라즈베리 파이 감지 - Qt5의 GPIO 핀 변경

나는 그것을 변경하는 경우 볼 수있는 모니터링해야하는 GPIO 핀 변화 (계속 폴링)가 다음과 같이

내 문제의 본질이다. 변경되면 로더를 사용하여 Qt5 프로젝트에 새 QML 파일을로드해야합니다. 로더 부분을 처리하는 방법을 알기 때문에 상당히 간단합니다. GPIO 핀을 폴링하고 변경 사항을 알리는 방법이 필요합니다.

QSocketNotifier 클래스가 도움이 될 수도 있음을 읽었습니다. 하지만 솔직히이 일을하는 방법에 관해서는 솔직하지 못합니다.

어떻게하는지 알아내는 데 도움이되는 도움을 주시면 감사하겠습니다. 고마워요 :)

편집 : 데비안에서 실행되는 나무 딸기 파이 기반 시스템에 대한 GUI에서 다른 옵션을 선택하기 위해 일종의 메인 메뉴를 만들고 있습니다. 대략 셋톱 박스와 비슷합니다. 화면상의 GUI 기반 버튼과 동일하게 GPIO 핀에 연결된 외부 버튼에서 하드웨어 기반 인터럽트를 가져와 새로운 페이지를로드하거나 새로운 활동을 시작할 수 있어야합니다.

올바르게 이해하면 코드의 C++ 부분이이 핀 변경을 캡처하여 QML 부분으로 전달해야합니다. 나는 이것을 할 수 있어야한다.

답변

1

당신은 환경과 그 밖의 일에 관해서 아무 말도하지 않았습니다. 다른 작업이나 o/s가 없으면 원하는 것이 무엇입니까? :

int last_state = -1; // impossible state so change is noticed the first time 
for (;;) // do forever 
{ 
     int state = get_gpio (THE_EVENT); 
     if (state == last_state) 
     { 
      sleep (100); 
      continue; 
     } 
     do_loader_stuff(); 
     last_state = state; 
} 
+0

빠른 응답을 주셔서 감사합니다. 음, 이것은 C++에 충실합니다. 로더는 proejct의 QML 코드에서 처리됩니다. 프로젝트의 QML 섹션에 알림이 필요합니다. 잠시 후, 내 질문을 업데이트하겠습니다. 아마도 도움이 될 것입니다. – Ra41P

0

핀을 인터럽트 구동으로 구성 할 수 있습니다. 이것이 작동하는 방식은 구성을 수행 한 후 핀을 나타내는 파일에서 select()을 이제 핀이 바뀌면 select()이 반환 할 수 있습니다. 지금

QFile exportFile("/sys/class/gpio/gpio19/export"); 
exportFile.open(QIODevice::WriteOnly); 
exportFile.write("19"); 

QFile directionFile("/sys/class/gpio/gpio19/direction"); 
directionFile.open(QIODevice::WriteOnly); 
directionFile.write("in"); 

QFile edgeFile("/sys/class/gpio/gpio19/edge"); 
edgeFile.open(QIODevice::WriteOnly); 
edgeFile.write("body"); 

대신 직접 select()를 사용하여, 당신은 QSocketNotifier를 사용할 수 있습니다 https://www.kernel.org/doc/Documentation/gpio/sysfs.txt 여기

핀 (19)에 대한 설정은 다음과 같은 형태가 될 것이다 : 여기

는 sysfs를의 GPIO 인터페이스에 대한 설명서입니다 .

QFile file("/sys/class/gpio/gpio19/value"); 

QSocketNotifier notifier(file.handle(), QSocketNotifier::Read); 
connect(&notifier, &QSocketNotifier::activated, this, &MyClass::interruptFired);