タイマーでLEDを点滅させる
タイマーを使ってLEDを点滅させます。タイマーは制御プログラムの基本中の基本です。gtkmmでは簡潔にコードを書くことができます。動作はボタンに点滅を追加しただけです。

最初にボタンをクリックするとLEDが点灯。

次にボタンをクリックすると点滅。

次にボタンをクリックすると消灯。
以上を繰り返します。
ソースコードを示します。
#include <gtkmm.h>
#include <iostream>
#include <wiringPi.h>

#define LED_PORT 4

class MainWin : public Gtk::Window
{
    Gtk::Button m_btnLed;
    int m_nLedMode, m_nBlinkMode, m_nBlinkCnt;

public:
    MainWin();

private:
    void on_btn_clicked();
    bool onTimer();
};

MainWin::MainWin()
{
    m_nLedMode = 0;
     m_btnLed.set_label("turn ON");
  // シグナルとスロットをコネクト
    m_btnLed.signal_clicked().connect( 
                sigc::mem_fun( *this, &MainWin::on_btn_clicked ) );
    add( m_btnLed );
    show_all_children();
     resize(240, 32);
     set_title("LEDの制御");
      Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWin::onTimer), 100);

}

bool MainWin::onTimer()
{
 if(m_nLedMode == 2)
 {
     if(m_nBlinkMode == 0)
     {
          digitalWrite(LED_PORT, 0);
     }
     else
     {
           digitalWrite(LED_PORT, 1);
     }
     m_nBlinkCnt++;
     if(m_nBlinkCnt >= 5)
     {
         m_nBlinkCnt = 0;
        if(m_nBlinkMode == 0)
        {
            m_nBlinkMode = 1;
        }
        else
        {
             m_nBlinkMode = 0;
        }
     }
   }
   return true;
}
// スロット関数
void MainWin::on_btn_clicked()
{
     if(m_nLedMode == 0)
     {
         m_nLedMode = 1;
        m_btnLed.set_label("bling");
          digitalWrite(LED_PORT, 1);
    }
     else if(m_nLedMode == 1)
     {
         m_nLedMode = 2;
        m_btnLed.set_label("turn OFF");
        m_nBlinkMode = 0;
        m_nBlinkCnt = 0;
     }
     else
     {
         m_nLedMode = 0;
         m_btnLed.set_label("turn ON");
         digitalWrite(LED_PORT, 0);
    }
}    


int main( int argc, char *argv[] )
{
     if(wiringPiSetupGpio() == -1)
    {
        std::cout << "GPIO setup error!" << std::endl;
        return -1;
    }
  pinMode(LED_PORT, OUTPUT);
    
    Gtk::Main kit( argc, argv );
    MainWin mainwin;
    Gtk::Main::run( mainwin );

    return 0;
}
タイマーをセットしているのは、
     Glib::signal_timeout().connect(sigc::mem_fun(*this, &MainWin::onTimer), 100);
100ms周期でタイムアウトにします。MainWin::onTimerはタイムアウトに呼ばれる関数です。名前は任意です。
   if(m_nBlinkCnt >= 5)
の数値を変えることでLEDの点滅周期を変えることができいます。あとは簡単なコードなので解説は割愛します。
目次へ