2016-08-10 10 views
1

私に許してください。これは非常に単純な質問になる可能性が高いことを知っていますが、別の目が必要です。私は自分のGUI上でチェックボックスを持っており、ボックスの状態(オン/オフ)が私の割り込みサービスルーチンを直接変更します。これは超簡単なようだが、私は使用することはできません。バリデータとしてQCheckBoxの状態を確認していますか?

this->ui->checkBox_2->isChecked(); 

を、このためには、それを超えて 「非メンバ関数である 『私は保存しようとしました』の無効な使用」の私のISRと呼ぶことができるいくつかのポインタまたは変数へのstateChanged(int arg1) の値ですが、私は範囲の問題を抱えていると思います。 何か提案を歓迎します!

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), 
             ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    connect(this->ui->pushButton_8,SIGNAL(clicked()),this,SLOT(on_pushButton_8_clicked())); 
    //connect(this->ui->checkBox_2,SIGNAL(clicked(bool)),this,SLOT(myInterruptRIGHT)); 
    //connect(this->ui->checkBox_2,SIGNAL(clicked(bool)),this,SLOT(myInterruptLEFT)); 
    // connect(on_checkBox_2_stateChanged(int arg1)(),SIGNAL(clicked(bool checked)),this,SLOT(myInterruptRIGHT)); 
    ui->pushButton->setText("STOP"); 


    ui->verticalSlider->setMinimum(6); 
    ui->verticalSlider->setMaximum(8); 
} 

void MainWindow::on_checkBox_2_stateChanged(int arg1) 
{ 
    QCheckBox *cb2 = new QCheckBox; 
    connect(cb2,SIGNAL(stateChanged(int)),this,SLOT(on_checkBox_2_stateChanged(int))); 
    int sensor = digitalRead(23); 
    //Does a bunch of stuff 
} 

void myInterruptRIGHT (void) 
{ 
    //if(this->ui->checkBox_2->isChecked()) 

    if(ui->checkBox_2->isChecked()) 

    { //Does stuff 
    } 
    else 
    { //more stuff 
    } 
} 


PI_THREAD(RightTop) 
{ 
    for(;;) 
    { 

     wiringPiISR(23,INT_EDGE_RISING,&myInterruptRIGHT); 

    } 
} 

私は、私は別のものの束をテストしてきたし、何も非常に有効であることが分かっていない、sloppishコードをお詫び申し上げます。

答えて

0

問題1:MainWindow::on_checkBox_2_stateChangedチェックボックスを作成し、チェックボックス信号のスロットに接続しますか?チェックボックスは、コンストラクタのどこかに作成されているか、UIのあらかじめ設計されたコード部分に作成されていることを確認してください。

問題2:PI_THREADは、スロットで信号を捕捉するQtスレッドではないようです。あなたはまだあなたの組み込みアプリケーションのために何かをすることができます。

もちろん私はソリューションをテストできませんでしたが、私は実際のアプリケーションで同様のテクニックを適用しました。 std::atomic<T>もお考えください。

class MainWindow : public QMainWindow 
{ 
    public: 
     QAtomicInt& atomicChkBox2State() {return m_chkBox2StateAtomic;} 
    //// snip 
    private: 
     QAtomicInt m_chkBox2StateAtomic; 
    //// snip 
}; 


void MainWindow::on_checkBox_2_stateChanged(int state) 
{ 
    m_chkBox2StateAtomic = state; 
} 


// where you create MainWindow you need to get that pointer somehow 

static MainWindow* s_pMainWnd; 
MainWindow* getMainWindow() {return s_pMainWnd;} // declare it in the .h file 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    s_pMainWnd = &w; // take an address 

    w.show(); 

    return a.exec(); 
} 

// and that ISR should read the atomic variable in case if does poll for check: 

void myInterruptRIGHT (void) 
{ 
    // now poll the atomic variable reflecting the state of checkbox 
    if(getMainWindow()->atomicChkBox2State()) 

    { //Does stuff 
    } 
    else 
    { //more stuff 
    } 
} 

これは、システム割り込みベクトルによって呼び出されたときに常に原子変数をポーリングするISRのためのものです。その割り込みサービスルーチンがチェックボックスからプッシュされた独自の終了信号を受け取るとしたら、組み込みプラットフォームの「システム割り込みではなく、サイドからISRを終了させる方法」を知らなくても、それに答えることはできません。

+0

それで、私はそれを試みましたが、そのようになるかもしれませんが、2つの同様のエラーが発生しています: '引数リストなしでQAtomicIntegerの無効な使用'。私は今のところ、あなたがそこに投げ込んだもので走り、結果が出たらそれを変更するかもしれないと考えました。 – jhizzla

+0

ああ、私はQt atomic int useを修正しようとする必要があります。 – AlexanderVX

+0

QAtomicIntegerではなくQAtomicIntを使用します。 – AlexanderVX

関連する問題