以前、モニタースリープ時に/dev/shm/へモニタースリープ状態を書き出す方法を紹介した。
<過去記事>
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にすると起動時にスリープになってしまった。何か違うプログラムから呼ばれているのだろう)
コレを過去記事と同様にコンパイルして保存してスタート時に呼ばれるよう設定すると完了。
-- /usr/lcoal/bin/sleep_hdmi --
#!/bin/sh
tvservice -o
exit 0
-- /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変換しているからかもしれない。