mmwavegesture-hmi: buf fix related to QSocket and doublefree
authorManisha Agrawal <manisha.agrawal@ti.com>
Thu, 13 Dec 2018 19:45:22 +0000 (19:45 +0000)
committerManisha Agrawal <manisha.agrawal@ti.com>
Thu, 13 Dec 2018 19:45:22 +0000 (19:45 +0000)
Signed-off-by: Manisha Agrawal <manisha.agrawal@ti.com>
keyword.cpp
keyword.h
main.cpp
main.qml
serialreaderthread.cpp
serialreaderthread.h

index 0b0cf96e125b1fb56401b8c20665e72caf351806..0e67f9d1de6b375aec913262ac22c4a58b3d75e9 100755 (executable)
@@ -33,6 +33,7 @@
 */\r
 #include <QCoreApplication>\r
 #include <QDebug>\r
+#include <QTimer>\r
 #include "keyword.h"\r
 \r
 QT_USE_NAMESPACE\r
@@ -46,16 +47,23 @@ Keyword::Keyword(QObject *qmlCompObject)
 \r
     m_qmlCompObject = qmlCompObject;\r
 \r
+    //initialize the displayed digits as 3337\r
+    for (int i = 0; i < 3; i++){\r
+        m_counter[i] = 0;\r
+    }\r
+\r
+    m_counter[3] = 5;\r
+\r
     /* Substract the keyword with 3 as the keyword is matched to the "model" index and not\r
      * the value at that index. Check the PathView in Digit.qml to understand model. A PathView\r
      * displays data from models created from built-in QML types.  A model provides a\r
      * set of data that is used to create the items for the view.  To avoid many scrolls to\r
      * to set the password, password is restricted between 3 and 8 and mmWave part number is\r
      * 6843, which is set as initial password*/\r
-    m_keyword[0] -= 3;\r
-    m_keyword[1] -= 3;\r
-    m_keyword[2] -= 3;\r
-    m_keyword[3] -= 3;\r
+    m_keyword[0] = 3;//6 - 3;\r
+    m_keyword[1] = 5;//8 - 3;\r
+    m_keyword[2] = 1;//4 - 3;\r
+    m_keyword[3] = 0;//3 - 3;\r
 \r
     qDebug() <<  " keyword index" << m_keyword[0] << m_keyword[1] << m_keyword[2] << m_keyword[3];\r
     m_activeIndex = 0;\r
@@ -71,10 +79,22 @@ Keyword::Keyword(QObject *qmlCompObject)
             m_digitArray[i]->setProperty("digit", m_counter[i]);\r
         }\r
     }\r
+\r
+    m_numtimes_keyword_match = 1;\r
 }\r
 \r
 Keyword::~Keyword()\r
 {\r
+    for (int i = 0; i < 4 ; i++){\r
+        m_digitArray[i] = nullptr;\r
+        m_counter[i] = 0;\r
+    }\r
+}\r
+\r
+void Keyword::emitKeywordQuit()\r
+{\r
+    qDebug() << "Emit keywordQuit signal\n";\r
+    emit keywordQuit();\r
 }\r
 \r
 void Keyword::handleDownGesture()\r
@@ -89,8 +109,15 @@ void Keyword::handleDownGesture()
             (m_digitArray[2]->property("digit") == m_keyword[2]) &&\r
             (m_digitArray[3]->property("digit") == m_keyword[3]));\r
 \r
+    //Refresh the screen with updated digit\r
+    QTimer::singleShot(0, m_qmlCompObject, SLOT(update()));\r
+\r
     if (keyMatch == true){\r
         m_qmlCompObject->setProperty("mypaused", false);\r
+        m_numtimes_keyword_match -= 1;\r
+        if(m_numtimes_keyword_match <= 0){\r
+            QTimer::singleShot(5000, this, SLOT(emitKeywordQuit()));\r
+        }\r
     }\r
 }\r
 \r
@@ -102,6 +129,9 @@ void Keyword::handleRightGesture()
 \r
     m_digitArray[m_activeIndex]->setProperty("borderColor", "red");\r
     m_digitArray[m_activeIndex]->setProperty("borderWidth", 9);\r
+\r
+    //Refresh the screen with updated digit index\r
+    QTimer::singleShot(0, m_qmlCompObject, SLOT(update()));\r
 }\r
 \r
 void Keyword::handleMotionDetected()\r
index bdd345c249690a41cd3fdcb213486e4a7b8670fa..109212dd078bdada8560c2bb853757986ec06a35 100755 (executable)
--- a/keyword.h
+++ b/keyword.h
@@ -51,21 +51,23 @@ class Keyword : public QObject
 public:\r
     Keyword(QObject *object);\r
     ~Keyword();\r
-    char m_keyword[4] = {6, 8, 4, 3};\r
+    unsigned int m_keyword[4];\r
+    int m_numtimes_keyword_match;\r
 \r
 signals:\r
-    void keywordMatched();\r
+    void keywordQuit();\r
 \r
 public slots:\r
     void handleDownGesture();\r
     void handleRightGesture();\r
     void handleMotionDetected();\r
     void handleNoActivity();\r
+    void emitKeywordQuit();\r
 \r
 private:\r
-    QObject *m_digitArray[4] = {nullptr};\r
-    unsigned char m_counter[4] = {0, 0, 4, 4};\r
-    unsigned char m_activeIndex = 0;\r
+    QObject *m_digitArray[4];\r
+    unsigned char m_counter[4];\r
+    unsigned char m_activeIndex;\r
     QObject *m_qmlCompObject;\r
 };\r
 \r
index 35f7cb69a72dd173880f4fd3cf24debb9351f924..f7c77150640aed2abf35b8ca85b1d2d1e7344d35 100644 (file)
--- a/main.cpp
+++ b/main.cpp
 #include "keyword.h"
 #include "serialreaderthread.h"
 
-void checkUserPassword(int argc, char *argv[], Keyword *keyword)
-{
-    if(argc > 1){
-        char *pw = argv[1];
-        keyword->m_keyword[0] = pw[0];
-        keyword->m_keyword[1] = pw[1];
-        keyword->m_keyword[2] = pw[2];
-        keyword->m_keyword[3] = pw[3];
-        qDebug() << pw[0] << pw[1] << pw[2] << pw[3];
-
-    }
-    else{
-        printf("User can set four digit password through command line argument\n");
-        printf("The digits should be between 3 and 8\n");
-        printf("Example usage: mmWaveGesture 7364");
-    }
-}
-
 int main(int argc, char *argv[])
 {
     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
@@ -69,6 +51,9 @@ int main(int argc, char *argv[])
     QQmlComponent component(&engine, QUrl("qrc:/main.qml"));
     QObject *object = component.create();
 
+    printf("Usage: mmwavegesture-hmi <# of iterations to open the lock> -platform eglfs\n");
+    printf("Default settings: # of iterations to open the lock = 1;  password = 6843\n");
+
     if(object == NULL){
         qDebug() << "Cannot create root object\n";
         return -1;
@@ -83,35 +68,31 @@ int main(int argc, char *argv[])
     object->setProperty("height", height);
     object->setProperty("mysource", "lock_unlock.gif");
 
-    /* Open the serial port. Serail port property gets set by SerialReaderThread Object */
-    QSerialPort serialPort;
-    QString serialPortName = "/dev/ttyACM1";// "XDS110 Class Auxiliary Data Port";
-    serialPort.setPortName(serialPortName);
-
-    if (!serialPort.open(QIODevice::ReadOnly)) {
-        qDebug() << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
-        return -1;
-    }
-    qDebug() << "opened serial port";
-
     /* Create Keyword and gestureReaderThread object. Connect the signals emitted by gestureRaederThread  with the slots in the Keyword object */
     Keyword keyword(object);
     SerialReaderThread *gestureReaderThread;
-    gestureReaderThread = new SerialReaderThread(&serialPort);
-
-    /*Connect the signals emitted by gestureRaederThread  with the slots in the Keyword object */
-    QObject::connect(gestureReaderThread, &SerialReaderThread::downGesture, &keyword, &Keyword::handleDownGesture);
-    QObject::connect(gestureReaderThread, &SerialReaderThread::rightGesture, &keyword, &Keyword::handleRightGesture);
-    QObject::connect(gestureReaderThread, &SerialReaderThread::motionDetected, &keyword, &Keyword::handleMotionDetected);
-    QObject::connect(gestureReaderThread, &SerialReaderThread::noActivity, &keyword, &Keyword::handleNoActivity);
+    gestureReaderThread = new SerialReaderThread();
 
+    /*Connect the signals and slots between gestureRaederThread and  Keyword object */
+    QObject::connect(gestureReaderThread, &SerialReaderThread::downGesture, &keyword, &Keyword::handleDownGesture, Qt::BlockingQueuedConnection );
+    QObject::connect(gestureReaderThread, &SerialReaderThread::rightGesture, &keyword, &Keyword::handleRightGesture, Qt::BlockingQueuedConnection );
+    QObject::connect(gestureReaderThread, &SerialReaderThread::motionDetected, &keyword, &Keyword::handleMotionDetected, Qt::BlockingQueuedConnection );
+    QObject::connect(gestureReaderThread, &SerialReaderThread::noActivity, &keyword, &Keyword::handleNoActivity, Qt::BlockingQueuedConnection );
+    QObject::connect(&keyword, &Keyword::keywordQuit, gestureReaderThread, &SerialReaderThread::handleQuit, Qt::QueuedConnection);
+    QObject::connect(gestureReaderThread, &SerialReaderThread::srtQuit, &app, &QGuiApplication::quit, Qt::QueuedConnection);
 
-    /* Check if password key is provided as cmd line  argument, else use default */
-    checkUserPassword(argc, argv, &keyword);
+    if(argc > 1){
+        keyword.m_numtimes_keyword_match = atoi(argv[1]);
+        qDebug() << "number of iterations to open the lock: " <<  keyword.m_numtimes_keyword_match;
+    }
 
     /* Start thread that reads the gesture from mmWave Sensor and take predetermined action per the gestures received */
     gestureReaderThread->start();
 
-    return app.exec();
+    app.exec();
+
+    qDebug() << "QGuiApplication execution over\n";
+
+    return 0;
 }
 
index e3ebe9611cb9bfd0180ee4ad6c776c8cac643b53..fcea1cf7860634f5670bd88c8ffdd99b6e4b032a 100644 (file)
--- a/main.qml
+++ b/main.qml
@@ -46,10 +46,24 @@ Window{
     property bool mypaused : true
     property bool myvisibility: false
 
-    Digit { id: digit1; visible: myvisibility; objectName: "myDigit1"; x:parent.width*0.25; y:parent.height * 0.7; size:parent.width*0.10}
-    Digit { id: digit2; visible: myvisibility; objectName: "myDigit2"; anchors.left:digit1.right; anchors.leftMargin:0.033*parent.width; y:digit1.y; size:parent.width*0.10}
-    Digit { id: digit3; visible: myvisibility; objectName: "myDigit3"; anchors.left:digit2.right; anchors.leftMargin:0.033*parent.width; y:digit1.y; size:parent.width*0.10}
-    Digit { id: digit4; visible: myvisibility; objectName: "myDigit4"; anchors.left:digit3.right; anchors.leftMargin:0.033*parent.width; y:digit1.y; size:parent.width*0.10}
+       Text {
+        text: "Enter 4 digits password 6843 to open the lock. " +
+              "Use up->down gesture to increment the counter of current highlighted digit. " +
+              "Use right->left gesture to move to next right digit index.\n"
+               font.family: "Helvetica"
+        font.pointSize: 20
+        fontSizeMode: Text.Fit
+        width: parent.width*0.7
+        wrapMode: Text.Wrap
+        color: "yellow"
+        x: parent.width*0.15
+        y: parent.height*0.85
+       }
+
+    Digit { id: digit1; visible: myvisibility; objectName: "myDigit1"; x:parent.width*0.275; y:parent.height * 0.65; size:parent.width*0.09}
+    Digit { id: digit2; visible: myvisibility; objectName: "myDigit2"; anchors.left:digit1.right; anchors.leftMargin:0.033*parent.width; y:digit1.y; size:digit1.size}
+    Digit { id: digit3; visible: myvisibility; objectName: "myDigit3"; anchors.left:digit2.right; anchors.leftMargin:0.033*parent.width; y:digit1.y; size:digit1.size}
+    Digit { id: digit4; visible: myvisibility; objectName: "myDigit4"; anchors.left:digit3.right; anchors.leftMargin:0.033*parent.width; y:digit1.y; size:digit1.size}
 
     property int activeid: 0
 
@@ -60,7 +74,7 @@ Window{
         width:parent.width/2; height: parent.height/2
         property int idx: 1
         x:(parent.width-width)/2
-        y: (parent.height-height)/4
+        y: parent.height*0.095// (parent.height-height)/4
         paused: mainWindow.mypaused
         onFrameChanged: if(currentFrame==frameCount-1) { mainWindow.mypaused = true; }
     }
index 8f6b2a518faa7d451c12749deabc2fc473c81fe3..7393e114243fd646563b61ca9e9b3db660c30474 100644 (file)
 #include "serialreaderthread.h"
 #include "mmwgesturein.h"
 
-SerialReaderThread::SerialReaderThread(QSerialPort *serialPort)
+SerialReaderThread::SerialReaderThread()
 {
-    m_serialPort = serialPort;
+    m_privmode = GESTURE_MODE_IDLE;
+    m_runSerialThread = true;
+}
 
-    serialPort->setBaudRate(921600, QSerialPort::Input);
-    serialPort->setDataBits(QSerialPort::Data8);
-    serialPort->setParity(QSerialPort::NoParity);
-    serialPort->setStopBits(QSerialPort::OneStop);
-    serialPort->setFlowControl(QSerialPort::NoFlowControl);
+SerialReaderThread::~SerialReaderThread(void)
+{
+    qDebug() << "SerailReaderThread object is being deleted\n";
+    m_serialPort->close();
+    delete m_serialPort;
+}
 
-    m_privmode = GESTURE_MODE_IDLE;
+int SerialReaderThread::createSerialPort()
+{
+    /* Open the serial port. Serail port property gets set by SerialReaderThread Object */
+    m_serialPort = new QSerialPort;
+    QString serialPortName = "/dev/ttyACM1";// "XDS110 Class Auxiliary Data Port";
+    m_serialPort->setPortName(serialPortName);
+
+    if (!m_serialPort->open(QIODevice::ReadOnly)) {
+        qDebug() << QObject::tr("Failed to open port %1, error: %2").arg(serialPortName).arg(m_serialPort->errorString()) << endl;
+        return -1;
 }
 
-SerialReaderThread::~SerialReaderThread(void){}
+    m_serialPort->setBaudRate(921600, QSerialPort::Input);
+    m_serialPort->setDataBits(QSerialPort::Data8);
+    m_serialPort->setParity(QSerialPort::NoParity);
+    m_serialPort->setStopBits(QSerialPort::OneStop);
+    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);
 
+    qDebug() << "Serial port opened successfully";
+    return 1;
+}
+
+void SerialReaderThread::handleQuit()
+{
+    m_runSerialThread = false;
+}
 
 void SerialReaderThread::run()
 {
-    while (1){
-        
+    printf("inside serialthread run\n");
+    //Need to create serialport in this thread else QT application throws error.
+    // QT doesn't allow QSocket to be accessed from two different threads (main thread and serial thread)
+    // Get inside while loop and attempt to read the bytes only if the serial port was opened successfully
+    if(createSerialPort() > 0){
+        while(m_runSerialThread == true){
         if ( m_serialPort->bytesAvailable() > 0 || m_serialPort->waitForReadyRead(10))
         {
             QByteArray ba;
@@ -95,10 +123,12 @@ void SerialReaderThread::run()
                         // default: qDebug() << "Unrecognized mode received" << mode_info;
                         break;
                     }
-
+                    }
                 }
             }
             msleep(1);
         }
     }
+    emit srtQuit();
+    qDebug() << "Serial reader thread quit\n";
 }
index a19f0b4580c002fef1a9748d889e2d81b464e484..76231e839cb27088fde60cd68b7bffe23963ea44 100644 (file)
@@ -45,7 +45,7 @@ class SerialReaderThread : public QThread
     Q_OBJECT
 
 public:
-    SerialReaderThread(QSerialPort *);
+    SerialReaderThread();
     ~SerialReaderThread(void);
 
 signals:
@@ -53,11 +53,18 @@ signals:
     void rightGesture();
     void motionDetected();
     void noActivity();
+    void srtQuit();
+
+public slots:
+    void handleQuit();
+
 protected:
     void run();
 
 private:
+    int createSerialPort();
     QSerialPort *m_serialPort;
     Gesture_mode_type m_privmode;
+    bool m_runSerialThread;
 };
 #endif // SERIALREADERTHREAD_H