From 621cd2e86d109e7deeea934ae5cfb82c5915d3d7 Mon Sep 17 00:00:00 2001 From: Jon Langseth Date: Sat, 4 Dec 2010 21:20:12 +0100 Subject: [PATCH 1/1] Working test with Qt GUI. Threaded, with no thread safety. --- JoystickView.pro | 13 ++ Makefile | 236 ++++++++++++++++++++++++++++++++++++ joystickdata.cpp | 42 +++++++ joystickdata.h | 25 ++++ joystickthread.cpp | 79 ++++++++++++ joystickthread.h | 37 ++++++ joystickview.cpp | 73 ++++++++++++ joystickview.h | 34 ++++++ joystickview.png | Bin 0 -> 29232 bytes joystickview.ui | 290 +++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 10 ++ 11 files changed, 839 insertions(+) create mode 100644 JoystickView.pro create mode 100644 Makefile create mode 100644 joystickdata.cpp create mode 100644 joystickdata.h create mode 100644 joystickthread.cpp create mode 100644 joystickthread.h create mode 100644 joystickview.cpp create mode 100644 joystickview.h create mode 100644 joystickview.png create mode 100644 joystickview.ui create mode 100644 main.cpp diff --git a/JoystickView.pro b/JoystickView.pro new file mode 100644 index 0000000..de3dca8 --- /dev/null +++ b/JoystickView.pro @@ -0,0 +1,13 @@ +# ------------------------------------------------- +# Project created by QtCreator 2010-12-01T17:33:12 +# ------------------------------------------------- +TARGET = JoystickView +TEMPLATE = app +SOURCES += main.cpp \ + joystickview.cpp \ + joystickdata.cpp \ + joystickthread.cpp +HEADERS += joystickview.h \ + joystickdata.h \ + joystickthread.h +FORMS += joystickview.ui diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f6f7bfd --- /dev/null +++ b/Makefile @@ -0,0 +1,236 @@ +############################################################################# +# Makefile for building: JoystickView +# Generated by qmake (2.01a) (Qt 4.5.0) on: Wed Dec 1 19:48:45 2010 +# Project: JoystickView.pro +# Template: app +# Command: /opt/qtsdk-2009.01/qt/bin/qmake -spec /opt/qtsdk-2009.01/qt/mkspecs/linux-g++-64 -unix CONFIG+=debug -o Makefile JoystickView.pro +############################################################################# + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +DEFINES = -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED +CFLAGS = -m64 -pipe -g -Wall -W -D_REENTRANT $(DEFINES) +CXXFLAGS = -m64 -pipe -g -Wall -W -D_REENTRANT $(DEFINES) +INCPATH = -I/opt/qtsdk-2009.01/qt/mkspecs/linux-g++-64 -I. -I/opt/qtsdk-2009.01/qt/include/QtCore -I/opt/qtsdk-2009.01/qt/include/QtGui -I/opt/qtsdk-2009.01/qt/include -I. -I. +LINK = g++ +LFLAGS = -m64 -Wl,-rpath,/opt/qtsdk-2009.01/qt/lib +LIBS = $(SUBLIBS) -L/opt/qtsdk-2009.01/qt/lib -lQtGui -L/opt/qtsdk-2009.01/qt/lib -L/usr/X11R6/lib64 -pthread -lfreetype -lgobject-2.0 -lSM -lICE -pthread -pthread -lXrender -lfontconfig -lXext -lX11 -lQtCore -lm -pthread -lgthread-2.0 -lrt -lglib-2.0 -ldl -lpthread +AR = ar cqs +RANLIB = +QMAKE = /opt/qtsdk-2009.01/qt/bin/qmake +TAR = tar -cf +COMPRESS = gzip -9f +COPY = cp -f +SED = sed +COPY_FILE = $(COPY) +COPY_DIR = $(COPY) -r +INSTALL_FILE = install -m 644 -p +INSTALL_DIR = $(COPY_DIR) +INSTALL_PROGRAM = install -m 755 -p +DEL_FILE = rm -f +SYMLINK = ln -sf +DEL_DIR = rmdir +MOVE = mv -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = main.cpp \ + joystickview.cpp \ + joystickdata.cpp \ + joystickthread.cpp moc_joystickview.cpp \ + moc_joystickdata.cpp +OBJECTS = main.o \ + joystickview.o \ + joystickdata.o \ + joystickthread.o \ + moc_joystickview.o \ + moc_joystickdata.o +DIST = /opt/qtsdk-2009.01/qt/mkspecs/common/g++.conf \ + /opt/qtsdk-2009.01/qt/mkspecs/common/unix.conf \ + /opt/qtsdk-2009.01/qt/mkspecs/common/linux.conf \ + /opt/qtsdk-2009.01/qt/mkspecs/qconfig.pri \ + /opt/qtsdk-2009.01/qt/mkspecs/features/qt_functions.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/qt_config.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/exclusive_builds.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/default_pre.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/debug.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/default_post.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/warn_on.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/qt.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/unix/thread.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/moc.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/resources.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/uic.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/yacc.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/lex.prf \ + JoystickView.pro +QMAKE_TARGET = JoystickView +DESTDIR = +TARGET = JoystickView + +first: all +####### Implicit rules + +.SUFFIXES: .o .c .cpp .cc .cxx .C + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.cc.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.cxx.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.C.o: + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" + +.c.o: + $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" + +####### Build rules + +all: Makefile $(TARGET) + +$(TARGET): ui_joystickview.h $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: JoystickView.pro /opt/qtsdk-2009.01/qt/mkspecs/linux-g++-64/qmake.conf /opt/qtsdk-2009.01/qt/mkspecs/common/g++.conf \ + /opt/qtsdk-2009.01/qt/mkspecs/common/unix.conf \ + /opt/qtsdk-2009.01/qt/mkspecs/common/linux.conf \ + /opt/qtsdk-2009.01/qt/mkspecs/qconfig.pri \ + /opt/qtsdk-2009.01/qt/mkspecs/features/qt_functions.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/qt_config.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/exclusive_builds.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/default_pre.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/debug.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/default_post.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/warn_on.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/qt.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/unix/thread.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/moc.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/resources.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/uic.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/yacc.prf \ + /opt/qtsdk-2009.01/qt/mkspecs/features/lex.prf \ + /opt/qtsdk-2009.01/qt/lib/libQtGui.prl \ + /opt/qtsdk-2009.01/qt/lib/libQtCore.prl + $(QMAKE) -spec /opt/qtsdk-2009.01/qt/mkspecs/linux-g++-64 -unix CONFIG+=debug -o Makefile JoystickView.pro +/opt/qtsdk-2009.01/qt/mkspecs/common/g++.conf: +/opt/qtsdk-2009.01/qt/mkspecs/common/unix.conf: +/opt/qtsdk-2009.01/qt/mkspecs/common/linux.conf: +/opt/qtsdk-2009.01/qt/mkspecs/qconfig.pri: +/opt/qtsdk-2009.01/qt/mkspecs/features/qt_functions.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/qt_config.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/exclusive_builds.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/default_pre.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/debug.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/default_post.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/warn_on.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/qt.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/unix/thread.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/moc.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/resources.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/uic.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/yacc.prf: +/opt/qtsdk-2009.01/qt/mkspecs/features/lex.prf: +/opt/qtsdk-2009.01/qt/lib/libQtGui.prl: +/opt/qtsdk-2009.01/qt/lib/libQtCore.prl: +qmake: FORCE + @$(QMAKE) -spec /opt/qtsdk-2009.01/qt/mkspecs/linux-g++-64 -unix CONFIG+=debug -o Makefile JoystickView.pro + +dist: + @$(CHK_DIR_EXISTS) .tmp/JoystickView1.0.0 || $(MKDIR) .tmp/JoystickView1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/JoystickView1.0.0/ && $(COPY_FILE) --parents joystickview.h joystickdata.h joystickthread.h .tmp/JoystickView1.0.0/ && $(COPY_FILE) --parents main.cpp joystickview.cpp joystickdata.cpp joystickthread.cpp .tmp/JoystickView1.0.0/ && $(COPY_FILE) --parents joystickview.ui .tmp/JoystickView1.0.0/ && (cd `dirname .tmp/JoystickView1.0.0` && $(TAR) JoystickView1.0.0.tar JoystickView1.0.0 && $(COMPRESS) JoystickView1.0.0.tar) && $(MOVE) `dirname .tmp/JoystickView1.0.0`/JoystickView1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/JoystickView1.0.0 + + +clean:compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +####### Sub-libraries + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) Makefile + + +mocclean: compiler_moc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_source_make_all + +compiler_moc_header_make_all: moc_joystickview.cpp moc_joystickdata.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_joystickview.cpp moc_joystickdata.cpp +moc_joystickview.cpp: joystickdata.h \ + joystickthread.h \ + joystickview.h + /opt/qtsdk-2009.01/qt/bin/moc $(DEFINES) $(INCPATH) joystickview.h -o moc_joystickview.cpp + +moc_joystickdata.cpp: joystickdata.h + /opt/qtsdk-2009.01/qt/bin/moc $(DEFINES) $(INCPATH) joystickdata.h -o moc_joystickdata.cpp + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_image_collection_make_all: qmake_image_collection.cpp +compiler_image_collection_clean: + -$(DEL_FILE) qmake_image_collection.cpp +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_joystickview.h +compiler_uic_clean: + -$(DEL_FILE) ui_joystickview.h +ui_joystickview.h: joystickview.ui + /opt/qtsdk-2009.01/qt/bin/uic joystickview.ui -o ui_joystickview.h + +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_header_clean compiler_uic_clean + +####### Compile + +main.o: main.cpp joystickview.h \ + joystickdata.h \ + joystickthread.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp + +joystickview.o: joystickview.cpp joystickview.h \ + joystickdata.h \ + joystickthread.h \ + ui_joystickview.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o joystickview.o joystickview.cpp + +joystickdata.o: joystickdata.cpp joystickdata.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o joystickdata.o joystickdata.cpp + +joystickthread.o: joystickthread.cpp joystickthread.h \ + joystickdata.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o joystickthread.o joystickthread.cpp + +moc_joystickview.o: moc_joystickview.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_joystickview.o moc_joystickview.cpp + +moc_joystickdata.o: moc_joystickdata.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_joystickdata.o moc_joystickdata.cpp + +####### Install + +install: FORCE + +uninstall: FORCE + +FORCE: + diff --git a/joystickdata.cpp b/joystickdata.cpp new file mode 100644 index 0000000..54d0c5b --- /dev/null +++ b/joystickdata.cpp @@ -0,0 +1,42 @@ +#include "joystickdata.h" + +JoystickData::JoystickData() +{ + for (int i = 0; i<6; i++) + { + this->setAxis(i, 512); + } + for (int i = 0; i<10; i++) + { + this->setButton(i, 0); + } + +} + +void JoystickData::setAxis( int axis, int value ) +{ + if (( axis < 0) || (axis > 5)) + return; + value = (value/64) + 512; // Conversion from +/-32768 to 0..1024 + axis_values[axis] = value; + emit valuechanged(); +} +void JoystickData::setButton( int button, bool value ) +{ + if (( button < 0) || (button > 9)) + return; + button_values[button] = value; + emit valuechanged(); +} +int JoystickData::getAxis( int axis ) +{ + if (( axis < 0) || (axis > 5)) + return -1; + return axis_values[axis]; +} +bool JoystickData::getButton( int button ) +{ + if (( button < 0) || (button > 9)) + return 0; + return button_values[button]; +} diff --git a/joystickdata.h b/joystickdata.h new file mode 100644 index 0000000..16de377 --- /dev/null +++ b/joystickdata.h @@ -0,0 +1,25 @@ +#ifndef JOYSTICKDATA_H +#define JOYSTICKDATA_H + +#include + +class JoystickData : public QObject +{ + Q_OBJECT + +private: + int axis_values[6]; + bool button_values[10]; + +public: + JoystickData(); + void setAxis( int axis, int value ); + void setButton( int button, bool value ); + int getAxis( int axis ); + bool getButton( int button ); + +signals: + void valuechanged( ); +}; + +#endif // JOYSTICKDATA_H diff --git a/joystickthread.cpp b/joystickthread.cpp new file mode 100644 index 0000000..bfd87ca --- /dev/null +++ b/joystickthread.cpp @@ -0,0 +1,79 @@ +#include "joystickthread.h" + +#include +#include +#include +#include +#include +#include +#include + +int JoystickThread::open_joystick(char *joystick_device) +{ + joystick_fd = open(joystick_device, O_RDONLY | O_NONBLOCK); + + return joystick_fd; +} +int JoystickThread::read_joystick_event(struct js_event *jse) +{ + int bytes; + + bytes = read(joystick_fd, jse, sizeof(*jse)); + + if (bytes == -1) + return 0; + + if (bytes == sizeof(*jse)) + return 1; + + return -1; +} + +JoystickThread::JoystickThread(JoystickData *data, QString device) +{ + this->device = device; + this->jd = data; + this->joystick_fd = -1; + this->done = 0; + +} + +void JoystickThread::run() +{ + int fd, rc; + + struct js_event jse; + fd = open_joystick(this->device.toLatin1().data()); + if (fd < 0) { + return; + } + while (!done) { + rc = read_joystick_event(&jse); + usleep(1000); + if (rc == 1) { + if (jse.type == JS_EVENT_AXIS) + { + if ( jse.number <= 5) + { + jd->setAxis(jse.number, jse.value); + } + } + if (jse.type == JS_EVENT_BUTTON) + { + if ( jse.number <= 9) + { + jd->setButton(jse.number, jse.value); + } + } + } + } + close(joystick_fd); + joystick_fd = -1; + done = 0; + return; +} +void JoystickThread::stop() +{ + this->done = 1; + this->wait(); +} diff --git a/joystickthread.h b/joystickthread.h new file mode 100644 index 0000000..ac89156 --- /dev/null +++ b/joystickthread.h @@ -0,0 +1,37 @@ +#ifndef JOYSTICKTHREAD_H +#define JOYSTICKTHREAD_H + +#include +#include "joystickdata.h" + +#define JS_EVENT_BUTTON 0x01 /* button pressed/released */ +#define JS_EVENT_AXIS 0x02 /* joystick moved */ +#define JS_EVENT_INIT 0x80 /* initial state of device */ +#define JS_EVENT_AXISENUM 0x81 /* enumeration of available axis */ +#define JS_EVENT_BUTTONENUM 0x81 /* enumeration of available buttons */ + +struct js_event { + unsigned int time; /* event timestamp in milliseconds */ + short value; /* value */ + unsigned char type; /* event type */ + unsigned char number; /* axis/button number */ +}; + +class JoystickThread : public QThread +{ +private: + JoystickData *jd; + int open_joystick(char *joystick_device); + int read_joystick_event(struct js_event *jse); + + int done; + int joystick_fd; + QString device; + +public: + JoystickThread(JoystickData *jd, const QString device); + void run(); + void stop(); +}; + +#endif // JOYSTICKTHREAD_H diff --git a/joystickview.cpp b/joystickview.cpp new file mode 100644 index 0000000..c2db695 --- /dev/null +++ b/joystickview.cpp @@ -0,0 +1,73 @@ +#include "joystickview.h" +#include "ui_joystickview.h" +#include "joystickdata.h" +#include "joystickthread.h" +#include +#include + +QSlider *sliders[6]; +QCheckBox *btns[10]; + +JoystickView::JoystickView(QWidget *parent) + : QMainWindow(parent), ui(new Ui::JoystickView) +{ + this->jd = new JoystickData(); + this->jthread = new JoystickThread(jd, "/dev/input/js0"); + + ui->setupUi(this); + ui->textbox->setPlainText("Starting"); + + QObject::connect(this, SIGNAL(forceupdate()), this, SLOT(updateValues())); + QObject::connect(jd, SIGNAL(valuechanged()), this, SLOT(updateValues())); + jthread->start(); + + sliders[0] = ui->axis1; + sliders[1] = ui->axis2; + sliders[2] = ui->axis3; + sliders[3] = ui->axis4; + sliders[4] = ui->axis5; + sliders[5] = ui->axis6; + + btns[0] = ui->button1; + btns[1] = ui->button2; + btns[2] = ui->button3; + btns[3] = ui->button4; + btns[4] = ui->button5; + btns[5] = ui->button6; + btns[6] = ui->button7; + btns[7] = ui->button8; + btns[8] = ui->button9; + btns[9] = ui->button10; + this->update(); +} + +JoystickView::~JoystickView() +{ + delete ui; +} + +void JoystickView::updateValues(void) +{ + QString output(""); + + output.append("Axis> "); + //ui->textbox->appendPlainText("Update\n"); + for ( int i = 0; i < 6; i++ ) + { + sliders[i]->setValue( jd->getAxis(i) ); + output.append(QString::number(i) + ":" + QString::number(jd->getAxis(i)) + " " ); + } + output.append("\nButtons>"); + for ( int i = 0; i < 10; i++ ) + { + btns[i]->setChecked( jd->getButton(i) ); + output.append(QString::number(i) + ":" + QString::number(jd->getButton(i)) + " " ); + } + ui->textbox->appendPlainText(output + "\n"); +} + +void JoystickView::on_pushButton_clicked() +{ + jthread->stop(); + QApplication::quit(); +} diff --git a/joystickview.h b/joystickview.h new file mode 100644 index 0000000..206d15c --- /dev/null +++ b/joystickview.h @@ -0,0 +1,34 @@ +#ifndef JOYSTICKVIEW_H +#define JOYSTICKVIEW_H + +#include +#include "joystickdata.h" +#include "joystickthread.h" + +namespace Ui +{ + class JoystickView; +} + +class JoystickView : public QMainWindow +{ + Q_OBJECT + +public: + JoystickView(QWidget *parent = 0); + ~JoystickView(); + +private: + Ui::JoystickView *ui; + JoystickData *jd; + JoystickThread *jthread; + +public slots: + void updateValues(void); +private slots: + void on_pushButton_clicked(); +signals: + void forceupdate(void); +}; + +#endif // JOYSTICKVIEW_H diff --git a/joystickview.png b/joystickview.png new file mode 100644 index 0000000000000000000000000000000000000000..aa168cad2b135794e850fc6ad749bc6e94e18590 GIT binary patch literal 29232 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 + + JoystickView + + + + 0 + 0 + 521 + 507 + + + + JoystickView + + + + + + 90 + 13 + 20 + 171 + + + + 1024 + + + 512 + + + Qt::Vertical + + + + + + 150 + 13 + 20 + 171 + + + + 1024 + + + 512 + + + Qt::Vertical + + + + + + 210 + 13 + 20 + 171 + + + + 1024 + + + 512 + + + Qt::Vertical + + + + + + 270 + 13 + 20 + 171 + + + + 1024 + + + 512 + + + Qt::Vertical + + + + + + 390 + 10 + 20 + 171 + + + + 1024 + + + 512 + + + Qt::Vertical + + + + + + 330 + 13 + 20 + 171 + + + + 1024 + + + 512 + + + Qt::Vertical + + + + + + 150 + 190 + 16 + 22 + + + + + + + + + + 170 + 190 + 16 + 22 + + + + + + + + + + 190 + 190 + 16 + 22 + + + + + + + + + + 210 + 190 + 16 + 22 + + + + + + + + + + 230 + 190 + 16 + 22 + + + + + + + + + + 250 + 190 + 16 + 22 + + + + + + + + + + 270 + 190 + 16 + 22 + + + + + + + + + + 290 + 190 + 16 + 22 + + + + + + + + + + 310 + 190 + 16 + 22 + + + + + + + + + + 330 + 190 + 16 + 22 + + + + + + + + + + 40 + 220 + 441 + 271 + + + + + + + 400 + 190 + 83 + 26 + + + + EXIT + + + + + + + + + diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..a983708 --- /dev/null +++ b/main.cpp @@ -0,0 +1,10 @@ +#include +#include "joystickview.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + JoystickView w; + w.show(); + return a.exec(); +} -- 2.39.2