xref: /OK3568_Linux_fs/app/forlinx/forlinx_qt/spitest/mainwindow.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include "mainwindow.h"
2*4882a593Smuzhiyun #include "ui_mainwindow.h"
3*4882a593Smuzhiyun #include <fcntl.h>
4*4882a593Smuzhiyun #include <sys/ioctl.h>
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <linux/spi/spidev.h>
7*4882a593Smuzhiyun #include <QMessageBox>
8*4882a593Smuzhiyun #include <unistd.h>
9*4882a593Smuzhiyun #include <QDir>
10*4882a593Smuzhiyun #include <QDebug>
11*4882a593Smuzhiyun #include <DWKeyboard/KeyboardGlobal.h>
12*4882a593Smuzhiyun 
MainWindow(QWidget * parent)13*4882a593Smuzhiyun MainWindow::MainWindow(QWidget *parent) :
14*4882a593Smuzhiyun     QMainWindow(parent),
15*4882a593Smuzhiyun     ui(new Ui::MainWindow)
16*4882a593Smuzhiyun {
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun     ui->setupUi(this);
19*4882a593Smuzhiyun 	GlobalInit();
20*4882a593Smuzhiyun 	ui->speed->installEventFilter(this);
21*4882a593Smuzhiyun 	ui->delay->installEventFilter(this);
22*4882a593Smuzhiyun 	ui->bits->installEventFilter(this);
23*4882a593Smuzhiyun 	ui->editsend->installEventFilter(this);
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 	setWindowState(Qt::WindowMaximized);
26*4882a593Smuzhiyun 	setWindowFlags(Qt::FramelessWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	ui->spidevlists->addItem(QWidget::tr("Please select SPI device"));
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	QDir dir("/dev/");
31*4882a593Smuzhiyun 	dir.setFilter(QDir::System | QDir::NoSymLinks );
32*4882a593Smuzhiyun 	QFileInfoList list = dir.entryInfoList();
33*4882a593Smuzhiyun 	for (int i = 0; i < list.size(); ++i) {
34*4882a593Smuzhiyun 		QFileInfo fileInfo = list.at(i);
35*4882a593Smuzhiyun 		if (fileInfo.fileName().contains("spidev",Qt::CaseSensitive)) {
36*4882a593Smuzhiyun 			char buff[100];
37*4882a593Smuzhiyun 			sprintf(buff, "/dev/%s", qPrintable(QString("%1").arg(fileInfo.fileName())));
38*4882a593Smuzhiyun 			qDebug() << qPrintable(QString("%1").arg(fileInfo.fileName()));
39*4882a593Smuzhiyun 			ui->spidevlists->addItem(QWidget::tr(buff));
40*4882a593Smuzhiyun 		}
41*4882a593Smuzhiyun 	}
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	connect(ui->spidevlists,
44*4882a593Smuzhiyun             SIGNAL(currentIndexChanged(const QString &)),
45*4882a593Smuzhiyun             this, SLOT(GetSpiDevName(const QString &)));
46*4882a593Smuzhiyun 	connect(ui->exitBtn, &QPushButton::clicked, this, [=](){
47*4882a593Smuzhiyun 			close();
48*4882a593Smuzhiyun 			});
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun 
eventFilter(QObject * watched,QEvent * event)53*4882a593Smuzhiyun bool MainWindow::eventFilter(QObject *watched, QEvent *event)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun 	static bool mFocusIn = false;
56*4882a593Smuzhiyun 	if (event->type()==QEvent::FocusIn)
57*4882a593Smuzhiyun 	{
58*4882a593Smuzhiyun 		mFocusIn = true;
59*4882a593Smuzhiyun 	}
60*4882a593Smuzhiyun 	else if (event->type()==QEvent::FocusOut)
61*4882a593Smuzhiyun 	{
62*4882a593Smuzhiyun 		PlatformInputContextBase->FocusOut(watched);
63*4882a593Smuzhiyun 		mFocusIn = false;
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	if (mFocusIn && event->type() == QEvent::MouseButtonPress) {
67*4882a593Smuzhiyun 		QMouseEvent *e = (QMouseEvent *)event;
68*4882a593Smuzhiyun 		PlatformInputContextBase->FocusIn(watched, e->globalPos());
69*4882a593Smuzhiyun 	}
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	return QMainWindow::eventFilter(watched,event);
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
GetSpiDevName(const QString & name)74*4882a593Smuzhiyun void MainWindow::GetSpiDevName(const QString &name)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun 	int ret;
77*4882a593Smuzhiyun     char buf[32];
78*4882a593Smuzhiyun     uint8_t mode;
79*4882a593Smuzhiyun     uint8_t bits = 8;
80*4882a593Smuzhiyun     uint32_t speed = 500000;
81*4882a593Smuzhiyun 	uint16_t delay;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun     sprintf(DevName, "%s", name.toStdString().data());
84*4882a593Smuzhiyun 	if (fd > 0)
85*4882a593Smuzhiyun 		::close(fd);
86*4882a593Smuzhiyun     fd = ::open(DevName, O_RDWR);
87*4882a593Smuzhiyun     if(fd < 0)
88*4882a593Smuzhiyun     {
89*4882a593Smuzhiyun         QMessageBox::about(this,"error","open spidev failure");
90*4882a593Smuzhiyun 		return ;
91*4882a593Smuzhiyun     }
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun     /*
94*4882a593Smuzhiyun      * spi mode
95*4882a593Smuzhiyun      */
96*4882a593Smuzhiyun     ret = ::ioctl(fd, SPI_IOC_WR_MODE, &mode);
97*4882a593Smuzhiyun     if (ret == -1)
98*4882a593Smuzhiyun 	    fprintf(stderr, "can't set spi mode");
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     ret = ::ioctl(fd, SPI_IOC_RD_MODE, &mode);
101*4882a593Smuzhiyun     if (ret == -1)
102*4882a593Smuzhiyun 	    fprintf(stderr, "can't get spi mode");
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     /*
106*4882a593Smuzhiyun      * bits per word
107*4882a593Smuzhiyun      */
108*4882a593Smuzhiyun     ret = ::ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
109*4882a593Smuzhiyun     if (ret == -1)
110*4882a593Smuzhiyun 	    fprintf(stderr, "can't set bits per word");
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun     ret = ::ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
113*4882a593Smuzhiyun     if (ret == -1)
114*4882a593Smuzhiyun 	    fprintf(stderr, "can't get bits per word");
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun     /*
117*4882a593Smuzhiyun      * max speed hz
118*4882a593Smuzhiyun      */
119*4882a593Smuzhiyun     ret = ::ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
120*4882a593Smuzhiyun     if (ret == -1)
121*4882a593Smuzhiyun 	    fprintf(stderr, "can't set max speed hz");
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     ret = ::ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
124*4882a593Smuzhiyun     if (ret == -1)
125*4882a593Smuzhiyun 	    fprintf(stderr, "can't get max speed hz");
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun     fprintf(stderr,"spi mode: %d\n", mode);
128*4882a593Smuzhiyun     fprintf(stderr,"bits per word: %d\n", bits);
129*4882a593Smuzhiyun     fprintf(stderr,"max speed: %d Hz (%d KHz)\n", speed, speed/1000);
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun     update_params();
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun 
update_params()134*4882a593Smuzhiyun void MainWindow::update_params()
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun     unsigned char mode = 0,bits;
137*4882a593Smuzhiyun     unsigned int speed,ret;
138*4882a593Smuzhiyun     unsigned short delay;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun     speed = ui->speed->text().toInt();
141*4882a593Smuzhiyun     delay = ui->delay->text().toInt();
142*4882a593Smuzhiyun     bits  = ui->bits->text().toInt();
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun     ::ioctl(fd, SPI_IOC_RD_MODE, &mode);
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun     if(ui->loop->isChecked())
147*4882a593Smuzhiyun         mode |= SPI_LOOP;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun     if(ui->clockphase->isChecked())
150*4882a593Smuzhiyun         mode |= SPI_CPHA;
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun     if(ui->clockpolarity->isChecked())
153*4882a593Smuzhiyun         mode |= SPI_CPOL;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun     if(ui->lsb->isChecked())
156*4882a593Smuzhiyun         mode |= SPI_LSB_FIRST;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun     if(ui->cshigh->isChecked())
159*4882a593Smuzhiyun         mode |= SPI_CS_HIGH;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun     if(ui->wire->isChecked())
162*4882a593Smuzhiyun         mode |= SPI_3WIRE;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     if(ui->nocs->isChecked())
165*4882a593Smuzhiyun         mode |= SPI_NO_CS;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun     if(ui->ready->isChecked())
168*4882a593Smuzhiyun         mode |= SPI_READY;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun     ret = ::ioctl(fd,SPI_IOC_WR_MODE,&mode);
171*4882a593Smuzhiyun     if(ret < 0)
172*4882a593Smuzhiyun     {
173*4882a593Smuzhiyun         QMessageBox::about(this,"error","SPI_IOC_WR_MODE failure");
174*4882a593Smuzhiyun         exit(0);
175*4882a593Smuzhiyun     }
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun     ret = ::ioctl(fd,SPI_IOC_WR_BITS_PER_WORD,&bits);
178*4882a593Smuzhiyun     if(ret < 0)
179*4882a593Smuzhiyun     {
180*4882a593Smuzhiyun         QMessageBox::about(this,"error","SPI_IOC_WR_BITS_PER_WORD failure");
181*4882a593Smuzhiyun         exit(0);
182*4882a593Smuzhiyun     }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun     ret = ::ioctl(fd,SPI_IOC_WR_MAX_SPEED_HZ,&speed);
185*4882a593Smuzhiyun     if(ret < 0)
186*4882a593Smuzhiyun     {
187*4882a593Smuzhiyun         QMessageBox::about(this,"error","SPI_IOC_WR_MAX_SPEED_HZ failure");
188*4882a593Smuzhiyun         exit(0);
189*4882a593Smuzhiyun     }
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
~MainWindow()193*4882a593Smuzhiyun MainWindow::~MainWindow()
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun     delete ui;
196*4882a593Smuzhiyun     ::close(fd);
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun 
on_send_clicked()199*4882a593Smuzhiyun void MainWindow::on_send_clicked()
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun     std::string str = ui->editsend->text().toStdString();
202*4882a593Smuzhiyun     struct spi_ioc_transfer tr;
203*4882a593Smuzhiyun     char buf[str.length()+1] = {0};
204*4882a593Smuzhiyun     memset(buf,0,str.length()+1);
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun     memset(&tr,0,sizeof(tr));
207*4882a593Smuzhiyun     tr.tx_buf = (__u64)str.c_str();
208*4882a593Smuzhiyun     tr.rx_buf = (__u64)buf;
209*4882a593Smuzhiyun     tr.len = str.length();
210*4882a593Smuzhiyun     tr.delay_usecs = ui->delay->text().toInt();
211*4882a593Smuzhiyun     tr.speed_hz = ui->speed->text().toInt();
212*4882a593Smuzhiyun     tr.bits_per_word = ui->bits->text().toInt();
213*4882a593Smuzhiyun     ::ioctl(fd,SPI_IOC_MESSAGE(1),&tr);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun     ui->editrecv->append(QString(buf));
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun 
on_loop_clicked(bool checked)219*4882a593Smuzhiyun void MainWindow::on_loop_clicked(bool checked)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun     update_params();
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun 
on_clockphase_clicked(bool checked)224*4882a593Smuzhiyun void MainWindow::on_clockphase_clicked(bool checked)
225*4882a593Smuzhiyun {
226*4882a593Smuzhiyun     update_params();
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
on_clockpolarity_clicked(bool checked)229*4882a593Smuzhiyun void MainWindow::on_clockpolarity_clicked(bool checked)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun     update_params();
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun 
on_lsb_clicked(bool checked)234*4882a593Smuzhiyun void MainWindow::on_lsb_clicked(bool checked)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun     update_params();
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun 
on_cshigh_clicked(bool checked)239*4882a593Smuzhiyun void MainWindow::on_cshigh_clicked(bool checked)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun     update_params();
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
on_wire_clicked(bool checked)244*4882a593Smuzhiyun void MainWindow::on_wire_clicked(bool checked)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun     update_params();
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun 
on_nocs_clicked(bool checked)249*4882a593Smuzhiyun void MainWindow::on_nocs_clicked(bool checked)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun     update_params();
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun 
on_ready_clicked(bool checked)254*4882a593Smuzhiyun void MainWindow::on_ready_clicked(bool checked)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun     update_params();
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun 
on_speed_textChanged(const QString & arg1)259*4882a593Smuzhiyun void MainWindow::on_speed_textChanged(const QString &arg1)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun     update_params();
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun 
on_delay_textChanged(const QString & arg1)264*4882a593Smuzhiyun void MainWindow::on_delay_textChanged(const QString &arg1)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun     update_params();
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
on_bits_textChanged(const QString & arg1)269*4882a593Smuzhiyun void MainWindow::on_bits_textChanged(const QString &arg1)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun     update_params();
272*4882a593Smuzhiyun }
273*4882a593Smuzhiyun 
moveEvent(QMoveEvent *)274*4882a593Smuzhiyun void MainWindow::moveEvent(QMoveEvent *)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun     this->move(QPoint(0,0));
277*4882a593Smuzhiyun }
278*4882a593Smuzhiyun 
resizeEvent(QResizeEvent *)279*4882a593Smuzhiyun void MainWindow::resizeEvent(QResizeEvent *)
280*4882a593Smuzhiyun {
281*4882a593Smuzhiyun     this->showMaximized();
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun 
closeEvent(QCloseEvent *)284*4882a593Smuzhiyun void MainWindow::closeEvent(QCloseEvent *)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun     exit(0);
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun 
289