タイマーを使って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の点滅周期を変えることができいます。あとは簡単なコードなので解説は割愛します。
|