SVG5/sthreadwatchport.cpp
2025-10-12 13:55:56 +09:00

174 lines
3.4 KiB
C++

#include "sthreadwatchport.h"
#include "mainwindow.h"
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h> /* low-level i/o */
#include <unistd.h>
#include <errno.h>
#include <string.h> // strerrno
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
//#include <stdexcept>
#include <sys/klog.h>
#include <linux/videodev2.h>
SThreadWatchPort::SThreadWatchPort():QSThread()
{
m_nDefaultMicroSleep = 1000*100;
m_nValue = 0;
m_nValuePrev = 0;
}
SThreadWatchPort::~SThreadWatchPort()
{
}
#include <poll.h>
void SThreadWatchPort::InnerRun()
{
m_nINotifyWatch = inotify_init();
QString strGPIO = MainWindow::GetCommonData()->GetHandswitchGPIONumber();
#ifdef __x86_64
usleep(m_nDefaultMicroSleep);
return;
#else
struct pollfd myPollfd;
myPollfd.fd = open(strGPIO.toUtf8(), O_RDONLY); //store filedescriptor in struct, open(path, read-write-permission)
myPollfd.events = POLLIN;
poll(&myPollfd, 1, 1); //poll(struct pollfd, max fd, timeout), timeout=-1 --> never
if(myPollfd.revents & POLLIN)
{
char buf[1024];
memset(buf, 0, 1024);
int len = read(myPollfd.fd, buf, 1024); //mandatory to make system register interrupt as served
if(len>0)
{
if(buf[0]=='1')
{
m_nValue = 1;
}
else
{
m_nValue = 0;
}
if(m_nValue==1 && m_nValuePrev==0)
{
CaptureHandSwitch();
}
m_nValuePrev = m_nValue;
}
}
lseek(myPollfd.fd, 0, 0); //return cursor to beginning of file or next read() will return EOF
close(myPollfd.fd);
usleep(m_nDefaultMicroSleep);
return;
m_nWatchGPIO271 = inotify_add_watch(m_nINotifyWatch, "/sys/class/gpio/gpio271/value", IN_ALL_EVENTS);
#endif
memset(m_pNotifyBuffer, 0, INOTIFY_BUF_LEN);
int nLength = 0;
nLength = read(m_nINotifyWatch, m_pNotifyBuffer, INOTIFY_BUF_LEN);
if(nLength<0)
{
//Error
qDebug() << "Notify Error";
return;
}
struct inotify_event* pEvent = (inotify_event*)&m_pNotifyBuffer[0];
if(pEvent->wd==1)
{
#ifdef __x86_64
QFile file("/home/birdhead/1.txt");
char cData;
if(file.open(QFile::ReadOnly)==true)
{
file.read(&cData, 1);
file.close();
}
if(cData=='1')
{
CaptureHandSwitch();
}
#else
char cRead = 0;
int nReadCount = 0;
int nGPIO_HandSwitch = 0;
//nGPIO_HandSwitch = open("/sys/class/gpio/gpio271/value", O_RDONLY);
nGPIO_HandSwitch = open(strGPIO.toUtf8(), O_RDONLY);
if(nGPIO_HandSwitch==-1)
{
qDebug() << "271 Open Failed";
}
else
{
//qDebug() << "271 Open success";
nReadCount = read(nGPIO_HandSwitch, &cRead, sizeof(char));
if(nReadCount>0)
{
//qDebug() << cRead;
if(cRead=='1')
{
CaptureHandSwitch();
}
}
close(nGPIO_HandSwitch);
}
#endif
}
close(m_nWatchGPIO271);
close(m_nINotifyWatch);
}
void SThreadWatchPort::Init()
{
}
void SThreadWatchPort::ExitThread()
{
m_bStop = true;
while(m_bRunning==true)
{
usleep(1000*10);
}
}