ブログ

Qtサンプル:LCD拡張ボードのスイッチのイベントを拾って表示する

at_kazutaka.bito
2015年2月1日 21時31分

Armadillo-440液晶開発セットで、Qtを使ってLCDタッチパネルにタッチした位置を表示するサンプルプログラム。 Qtの開発環境については、下記URLを参考

参考URL)

  • Howto : Armadillo-440でQt! 第2回
    • http://armadillo.atmark-techno.com/howto/armadillo-440-qt-2
  • Howto : Armadillo-440でQt! 第3回
    • http://armadillo.atmark-techno.com/howto/armadillo-440-qt-3

以下、Howto : Armadillo-440でQt! 第3回を最後まで実行したQtCreatorのプロジェクトを使う。 mainwindow.hとmainwindow.cppを以下のように変更する。(追加箇所には、/ /でコメントしてある。) ビルドして実行すると、LCD拡張ボードのスイッチ(SW1、SW2、SW3)を押すと、LCDに対応するスイッチ名が表示される。

1.カーネルの修正

atmark-dist/linux-2.6.x/arch/arm/mach-mx25/armadillo400.c 内の static struct gpio_keys_button armadillo400_key_buttons[] を下記のように変更して、ビルドしたカーネルをArmadilloに書き込む。

static struct gpio_keys_button armadillo400_key_buttons[] = {
    {KEY_ENTER, GPIO(3, 30), 1, "SW1",     EV_KEY, CONFIG_ARMADILLO400_SW1_GPIO_3_30_IS_WAKE_SRC},
#if defined(CONFIG_MACH_ARMADILLO410) || defined(CONFIG_MACH_ARMADILLO440) || defined(CONFIG_MACH_ARMADILLO460)
//    {KEY_BACK,  GPIO(2, 20), 1, "LCD_SW1", EV_KEY, CONFIG_ARMADILLO400_CON11_39_GPIO_2_20_IS_WAKE_SRC}, /* Original */
    {KEY_KP1,  GPIO(2, 20), 1, "LCD_SW1", EV_KEY, CONFIG_ARMADILLO400_CON11_39_GPIO_2_20_IS_WAKE_SRC}, /* for Qt */
#if defined(CONFIG_ARMADILLO400_CON11_40_GPIO_2_29)
//    {KEY_MENU,  GPIO(2, 29), 1, "LCD_SW2", EV_KEY, CONFIG_ARMADILLO400_CON11_40_GPIO_2_29_IS_WAKE_SRC}, /* Original */
    {KEY_KP2,  GPIO(2, 29), 1, "LCD_SW2", EV_KEY, CONFIG_ARMADILLO400_CON11_40_GPIO_2_29_IS_WAKE_SRC}, /* for Qt */
#endif
#if defined(CONFIG_ARMADILLO400_CON11_41_GPIO_2_30)
    {KEY_HOME,  GPIO(2, 30), 1, "LCD_SW3", EV_KEY, CONFIG_ARMADILLO400_CON11_41_GPIO_2_30_IS_WAKE_SRC},
#endif
#endif /* CONFIG_MACH_ARMADILLO410 || CONFIG_MACH_ARMADILLO440 || CONFIG_MACH_ARMADILLO460 */
};

理由)
/dev/input/event0のキーイベントについて https://users.atmark-techno.com/node/1116 を参考にすると、 LCD拡張ボードのスイッチ(SW1、SW2)のKEY_BACK、KEY_MENUは、Qtには割り当てられていない。 そのため、Qtに割り当てられているコードに置き換えている。

2.QtCreatorで、キーイベントを取得するためのシステム環境変数を追加

Howto : Armadillo-440でQt! 第3回 * http://armadillo.atmark-techno.com/howto/armadillo-440-qt-3

「ターゲットへのデプロイ/リモートデバッグ設定」のシステム環境変数の設定箇所を参考に 変数:QWS_KEYBOAD 値:/dev/input/event0 を追加する。

補足)変数のQWS_KEYBOADはタイプミスではない。

3.mainwindow.hとmainwindow.cppを以下のように変更する。(追加箇所には、/ /でコメントしてある。) mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QKeyEvent> /* add: QKeyEvent */
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
protected:
    void keyPressEvent(QKeyEvent *event); /* add: keyPressEvent */
    void paintEvent(QPaintEvent *event); /* add: paintEvent */
 
private:
    Ui::MainWindow *ui;
    QString str_sw; /* add: string SW */
};
 
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui> /* add: QtGui */
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
/* add keyPressEvent */
void MainWindow::keyPressEvent(QKeyEvent *event)
{
    switch(event->key())
    {
    case Qt::Key_1:
    str_sw = "SW1";
        break;
    case Qt::Key_2:
    str_sw = "SW2";
        break;
    case Qt::Key_Home:
    str_sw = "SW3";
        break;
    default:
        break;
    }
    update();
}
 
/* add paintEvent */
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawText(100, 100, 100, 50, Qt::AlignLeft, str_sw);
}

概要
・ QString str_sw; /* add: string SW */
 LCD拡張ボードの押したスイッチ名を文字列化したもの

・void keyPressEvent(QKeyEvent event); / add: keyPressEvent */
 LCD拡張ボードのスイッチを押したイベントで実行される
 スイッチのコードは、 event->key()  で取得できる。   Key_1:SW1   Key_2:SW2   Key_Home:SW3  に相当する。
 スイッチ名を文字列でstr_swに設定し、updateでLCDの表示内容を更新する。

・void paintEvent(QPaintEvent event); / add: paintEvent */
 上述のスイッチ名の文字列str_swをLCDに表示。