DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

RaspberryPiでモニタースリープ時にHDMIの出力をOFFにする(HDMI出力先によるらしい)

以前、モニタースリープ時に/dev/shm/へモニタースリープ状態を書き出す方法を紹介した。 

<過去記事>

dreamerdream.hateblo.jp

 

PiTFTでスリープ時にバックライトが消えないがHDMI出力も同じように画面が真っ暗になるだけでモニタの電源は消えない。

なので今回はHDMIへの出力をOFFにするようにする。

HDMIへの出力ON/OFFはコンソールから扱えるそうだ。

参考にさせてもらったサイト

Raspberry Piで、HDMI出力をON/OFFする | Soramimi Vox

Raspberry PiでHDMIで接続したディスプレイの制御 - Qiita

 

ということは以前のコードを改造したらON/OFF制御できるんじゃないか?と思いモニタースリープを検知するコードと置き換えることにした。

-- dodpms.cpp --

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <unistd.h>

extern "C" {
#include <X11/Xlib.h>
#include <X11/Xproto.h>
#include <X11/extensions/dpms.h>
}

Display *dpy = NULL;
CARD16 standby, suspend, off;

int main(int argc, const char **argv)
{
dpy = XOpenDisplay(NULL);
if (! dpy) {
fprintf(stderr, "XOpenDisplay failed.\n");
exit(1);
}

CARD16 state;
BOOL onoff = False;
for(;;){
usleep(300000);
DPMSInfo(dpy, &state, &onoff);
if(state != 0 && access("/usr/local/bin/sleep_hdmi",0)==0 && access("/usr/local/bin/active_hdmi",0)==0 ){
system("/usr/local/bin/sleep_hdmi");
for(;;){
usleep(300000);
DPMSInfo(dpy, &state, &onoff);
if(state == 0) break;
}
system("/usr/local/bin/active_hdmi");
}
}
}

 

つまり、スリープ時には/usr/local/bin/sleep_hdmiに書いたスクリプトが呼ばれ、復帰時には/usr/local/bin/active_hdmiに書いたスクリプトが呼ばれるようにした。

(なぜか/usr/local/bin/sleepにすると起動時にスリープになってしまった。何か違うプログラムから呼ばれているのだろう)

 

コレを過去記事と同様にコンパイルして保存してスタート時に呼ばれるよう設定すると完了。

 

HDMI 出力OFFスクリプト

-- /usr/lcoal/bin/sleep_hdmi --

#!/bin/sh
tvservice -o
exit 0

 

HDMI 出力再開スクリプト

-- /usr/local/bin/active_hdmi --

#!/bin/sh
tvservice -p
fbset -depth 8
fbset -depth 16 #8/16/24等環境によるらしい
exit 0

 

・・・しかし僕の環境ではOFFはできるもののONがうまくいかない。。ONまでは出来るけどどうやらfbsetあたりでつまづいているらしい。

なんでだろ? HDMI→DVI変換しているからかもしれない。

kampa.me