text: ﻿#ifndef PM3PROCESS_H
  #define PM3PROCESS_H
  
  #include <QProcess>
  #include <QThread>
  #include <QString>
  #include <QDebug>
  #include <QTimer>
  #include <QtSerialPort/QSerialPortInfo>
  #include <QtSerialPort/QSerialPort>
  #include <QProcessEnvironment>
  #include <QDir>
  
  #include "util.h"
  
  class PM3Process : public QProcess
  {
      Q_OBJECT
  public:
      explicit PM3Process(QThread* thread, QObject* parent = nullptr);
      bool waitForReadyRead(int msecs = 2000);
  
      void testThread();
  
  public slots:
      void connectPM3(const QString& path, const QStringList args);
      void setSerialListener(const QString& name, bool state);
      void setSerialListener(bool state);
      qint64 write(QString data);
      void reconnectPM3();
      void setProcEnv(const QStringList* env);
      void setWorkingDir(const QString& dir);
      void killPM3();
  private slots:
      void onTimeout();
      void onReadyRead();
  private:
      bool isRequiringOutput;
      QString* requiredOutput; // It only works in this class now
      void setRequiringOutput(bool st);// It only works in this class now
      QTimer* serialListener;
      QSerialPortInfo* portInfo;
      QString currPath;
      QString currPort = "";
      QStringList currArgs;
  
  signals:
      void PM3StatedChanged(bool st, const QString& info = "");
      void newOutput(const QString& output);
      void changeClientType(Util::ClientType);
  };
  
  #endif // PM3PROCESS_H
  