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に表示。