BigQlock

Raspberry Pi向け、時計アプリを開発中です。

bigqlock

元は、Palm OS用のBigClockというアプリです。もうちょっとできてきたらソース公開します。

http://www.soramimi.jp/bigqlock/

カテゴリー: 未分類 | コメントをどうぞ

Windowsで実行中のOSが64ビットか確認する方法

備忘録です。

bool is64()
{
    void (WINAPI *fn_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
    HMODULE hm = LoadLibrary(L"kernel32");
    (FARPROC &)fn_GetNativeSystemInfo = GetProcAddress(hm, "GetNativeSystemInfo");
    if (fn_GetNativeSystemInfo) {
        SYSTEM_INFO info;
        fn_GetNativeSystemInfo(&info);
        if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
            return true;
        }
    }
    return false;
}
カテゴリー: 備忘録 | コメントをどうぞ

Raspberry Pi 7インチ公式タッチディスプレイ

http://akizukidenshi.com/catalog/g/gM-09917/

Raspberry Pi 7インチ公式タッチディスプレイで、液晶画面のバックライトをON/OFFしたり、輝度を変更する方法。

バックライトをOFF

echo 1 > /sys/class/backlight/rpi_backlight/bl_power

バックライトをON

echo 0 > /sys/class/backlight/rpi_backlight/bl_power

バックライトの輝度を変更

echo 80 > /sys/class/backlight/rpi_backlight/brightness
カテゴリー: 未分類 | コメントをどうぞ

WindowsでQtでOCX

Windows上でQtを使ってOCX(ActiveXコントロール)を作っています。

https://github.com/soramimi/ActiveQtExample

↑ここまでできています。

MyControlとMyAppというプロジェクトがあります。前者はOCXです。後者はexeアプリケーションで、メインウィンドウにOCXが貼り付けてあります。

それぞれのプロジェクトをリリースビルドします。

build/release フォルダに移動します。Qt SDKのbinフォルダから、Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dllの3つをコピーします。続いて、

regsvr32 MyControl.dll

を実行して、コントロールを登録します。(登録解除するには /u を付けて実行します)

MyApp.exeを実行すると、ウィンドウが表示され、楕円が描画されます。メインウィンドウはMyApp.exeが表示し、楕円はMyControl.dllが描画するようになっています。

activeqt

ウィンドウの閉じるボタンを押すと、閉じることはできますが、タスクマネージャーを見ると、MyApp.exeが残ったままになっています。

本家フォーラムにも、同様な現象が報告されているのですが、進展がないようです。

この不具合は、MyApp.exeがリリースビルドの時だけ発生し、デバッグビルドにすると、正常に動作するようです。

また、MyAppのメインウィンドウに、下記のようなコードを追加すると、プロセスは終了しますが、根本的な解決ではないような気がします。

#include <windows.h>

void MainWindow::closeEvent(QCloseEvent *e)
{
    PostQuitMessage(0);
    QMainWindow::closeEvent(e);
}

開発環境: Windows 7 (64bit)  / MSVC2013 / Qt5.5.1


これは仕様っぽい?

https://bugreports.qt.io/browse/QTBUG-29116

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QObject::connect(qApp, SIGNAL(lastWindowClosed()), qApp, SLOT(quit()));
    return a.exec();
}

最後のウィンドウが閉じたときに、アプリケーションを終了する、って明示的に書かないといけないのかな。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    a.setQuitOnLastWindowClosed(true);
    return a.exec();
}

これでもいいみたい。ただし、 w.show(); より先に a.setQuitOnLastWindowClosed(true); を実行すると、うまくいかない様です。

カテゴリー: 未分類 | コメントをどうぞ

東急バス降車ボタンキット

東急バス降車ボタンキットに付属するスイッチの結線について解説します。

tomarimasu0

3ピンのコネクタがついています。 中央の黒がGND、白に12Vをかけるとランプがつきます。緑がスイッチです。

tomarimasu1

内部の様子です。

tomarimasu2

コネクタは2mmピッチです。

tomarimasu3

カテゴリー: 未分類 | コメントをどうぞ

Arduinoでコンテナクラス

Arduino IDEを利用してESP8266用の開発をしていて、STLのstd::string、std::vector、std::listを使いたくなったのですが、コンパイルしてみると、大量のリンクエラーが出てしまいました。原因を追及するのが面倒になったので、代替ライブラリを作ってみました。はい、車輪の再発明です。

https://github.com/soramimi/TinyContainer

TinyContainerというフォルダの中に、TinyContainer.hというファイルが入っています。このフォルダを圧縮して、TinyContainer.zipを作ります。これを[スケッチ][Include Library][Add .ZIP Library...]を選択して、登録します。

addlib

一旦Arduino IDEを終了して、再起動します。

newlib

[Include Library]の下の方に[TinyContainer]が登録されます。これを選択すると、スケッチに #include <TinyContainer.h> が追加されます。

使い方は、STLのstring、vector、listとだいたい同じです。名前空間はtinyです。tiny::string、tiny::vector、tiny::listとして使用できます。

間に合わせで作ったため、完全に規格に準拠した設計にはなっておらず、多少異なる点があるかと思います。基本的な、文字列、動的配列、双方向リンクリストとして使用することはできます。辞書(map)は複雑なので作っていません。

登録したライブラリをアンインストールする場合は、以下のフォルダを削除します。

C:\Users\<username>\Documents\Arduino\libraries\TinyContainer

カテゴリー: 未分類 | コメントをどうぞ

SONYのWi-Fi対応デジカメで写真の転送ができない件

Wi-Fiに対応したSONYのデジタルカメラで、PCに写真を転送するには、PlayMemories Home というアプリをインストールするのですが、そのPCをファイルサーバにしているなどで、別のPCからリモートデスクトップ接続でログオンし、そのセッションで PlayMemories Home が動作している場合、または、その状態で、カメラを接続して、Wi-Fi転送の設定を行った場合に、デジカメ側からの写真転送ができないようです。カメラの画面には、「検索中」「接続中」まで出ますが、「転送中」にならずに、永遠に待ち続けるという症状になります。

この件について、SONYに問い合わせ中です。

デジカメの機種に依存しているかどうかは不明です。(筆者のはDSC-HX30Vというものです)

【追記】 SONYでは、リモートデスクトップ接続の環境で、PlayMemories Homeの動作確認は行っていないとの回答。急がないので、できたら対応してください、と、要望を出しておきました。

カテゴリー: 未分類 | コメントをどうぞ

Pi-DAC+

秋月電子通商で購入できる Raspberry Pi 用オーディオモジュールPi-DAC+を使用するためのメモ。OSは標準のRaspbianを想定。

詳細は http://www.iqaudio.com/downloads/IQaudIO.pdf

抜粋すると、

  1. rpi-update を実行する。
  2. /boot/config.txt に dtoverlay=iqaudio-dacplus という定義を追加する。
  3. 再起動する。
  4. aplay -l を実行して、認識されたか確認する。

これだけで、使用できるようになるはずだが、ついでに、標準のオーディオ出力を無効にしたかったら、 /etc/modules の snd-bcm2835 をコメントする。

カテゴリー: 未分類 | コメントをどうぞ

Qtでウィンドウを作成してから描画されるまで

個人的なメモです。

Qtで、MainWindowが作成されてから、paintEventが呼ばれるまでの間の、イベント履歴を取得してみました。

Value Event
----- ----------------------------
68    QEvent::ChildAdded
68    QEvent::ChildAdded
68    QEvent::ChildAdded
68    QEvent::ChildAdded
33    QEvent::WindowTitleChange
217   QEvent::PlatformSurface
203   QEvent::WinIdChange
34    QEvent::WindowIconChange
75    QEvent::Polish
69    QEvent::ChildPolished
69    QEvent::ChildPolished
69    QEvent::ChildPolished
69    QEvent::ChildPolished
69    QEvent::ChildPolished
13    QEvent::Move
14    QEvent::Resize
17    QEvent::Show
183   QEvent::CursorChange
26    QEvent::ShowToParent
74    QEvent::PolishRequest
76    QEvent::LayoutRequest
78    QEvent::UpdateLater
77    QEvent::UpdateRequest
24    QEvent::WindowActivate
99    QEvent::ActivationChange
7     QEvent::KeyRelease
12    QEvent::Paint

正確なところは知りませんが、QEvent::Showが処理された後で、子ウィジェットのサイズが確定している模様です。QEvent::LayoutRequestまで通過すれば、ウィンドウの中身が完成していると思われます。

ウィンドウが表示される前に、子ウィジェットのサイズを取得したい様な場合、下記のようにするといいかと思います。

bool MainWindow::event(QEvent *e)
{
    bool f = QMainWindow::event(e);

    {
        QEvent::Type type = e->type();
        if (type == QEvent::LayoutRequest) {
            // あんなことやこんなことをする
        }
    }

    return f;
}
カテゴリー: 備忘録 | コメントをどうぞ

DN2820FYKH に Windows 7 をインストールしようとするとBSODになる件

Intel NUC DN2820FYKH に Windows 7 をインストールしようとしたところ、以下のようなメッセージと共に、ブルースクリーンで固まってしまいました。

The BIOS in this system is not fully ACPI compliant, Please contact your system vendor for an updated BIOS.

これは既知の問題です。ですが、不具合というより、設定の問題です。リンク先にもあるように、解決方法の詳細はこちらです。

DN2820FYKHは出荷時の設定では、Windows 8向けの設定がなされています。

起動時にF2を押してBIOSの設定画面に入り、まず、Legacy Boot Priorityの設定で、Legacy Bootが有効(enabled)になっていることを確認します。次に、UEFI Bootの設定で、OS SelectionでWindows 7を選択します。

Windows 7は、UEFIではなく、Legacy Bootで起動しますが、そうあっても、UEFI Bootの設定を変更しておく必要があるようです。

カテゴリー: 備忘録 | コメントをどうぞ